docker compose postgresql导入转储

Docker-Compose Postgresql import dump

我有一个关于Docker和Postgres的问题。每次Docker启动并想导入一个给定的转储文件时,我都会建立一个新的Postgres数据库。

我的问题是,但答案对我来说还不够:docker postgres不在docker entrypoint initdb.d中运行init文件

码头工人组成:

1
2
3
4
5
6
7
8
postgres:
  environment:
   - POSTGRES_USER=****
   - POSTGRES_PASSWORD=****
   - POSTGRES_DB=****
build:
  context: .
  dockerfile: dockerfile-postgres

我的dockerfile:(我已经用一个以.sh结尾的脚本尝试过了)

1
2
FROM postgres
ADD dump.sql /docker-entrypoint-initdb.d/

根据https://hub.docker.com//postgres/dump.sql,必须使用SQL导入数据库。

使用Docker启动应用程序只会提供:

1
2
3
4
5
postgres_1     | LOG:  invalid record LENGTH at 0/1708600
postgres_1     | LOG:  redo IS NOT required
postgres_1     | LOG:  MultiXact member wraparound protections are now enabled
postgres_1     | LOG:  DATABASE system IS ready TO accept connections
postgres_1     | LOG:  autovacuum launcher started

此外,我还测试了我的数据库是否已经导入,我的数据库中没有表。我做错了什么(文件在目标系统上是可读的和可执行的)?用psql导入没有问题,所以我的转储是正确的。

我希望你能帮助我,我想提前感谢你。


好吧,我找到了窍门,我必须执行"docker compose rm"才能执行这个文件夹中的脚本和SQL文件。一旦建立并没有删除init文件夹将被忽略。

更新我再次遇到这个问题,这次移除Docker创建的图像解决了这个问题。


这里的答案在一定程度上解决了我的问题,但是让docker-entrypoint-initdb/*.sql脚本工作的最后一步是确保SQL脚本本身没有语法问题(我有问题是因为我在Dockerfile中更改了SQL版本)。

如果有的话,docker-entrypoint-initdb/*.sql脚本中的所有内容似乎都会回滚。

要检查是否存在任何语法脚本问题(或其他问题),您可能会发现查看Docker日志很有用:

1
$ docker ps -ALL

注意:-all确保它列出了那些可能无法启动的图像。

查找刚刚创建的图像,并查找容器ID,该ID应为12个字符的哈希:

1
$ docker logs baf32ff7ec03

请记住,您仍然需要遵循这里的其他答案-这是RM以前构建的图像和删除您的数据文件夹(如果需要备份它)。


这是因为很可能

initdb脚本docker-entryfile.sh负责按字母顺序运行/docker-entrypoint-initdb.d/*文件,仅在创建卷时首次运行。

你可以在这里看到一些细节。

解决方案(与我一起工作)这是我的Docker撰写文件中的一个片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  postgres_service:
    build:
      context : docker-postgres
      dockerfile: Dockerfile-base
    image: 'datahub/postgres:development'
    USER: postgres
    ports:
      -"5432:5432"
    env_file:
      - credentials/postgres/development.env
    volumes:
      - /Users/yogesh.yadav/DockerData/datahub/postgresql/DATA:/var/lib/postgresql/DATA
    restart: unless-stopped
    networks:
      - datahubnetwork

步骤-

1)江户十一〔2〕

docker-compose -f docker-compose-filename.yml stop postgres_service

2)删除Postgres ou Service Docker服务附带的卷/卷(/users/yogesh.yadav/docker data/datahub/postgresql/data)。您可以手动或通过docker-compose rmdocker volume rm执行此操作。请在删除该Postgres服务之前确定您的卷。更多信息在这里

3)Docker通过构建和运行图像来使用非常好的缓存管理。如果您没有修改您的Dockerfile,docker将从缓存中运行已经构建的映像并运行它。所以我建议删除Postgres服务的图片。

列出图像

1
docker images -a

输出-

1
2
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
datahub/postgres          development         e7707e670ad4        35 minutes ago      265 MB

删除该图像(如果需要,请使用-f)

1
docker rmi IMAGE_ID_HERE

4)重新启动服务

1
docker-compose -f docker-compose-filename.yml up --build postgres_service

这一次,您可以看到您的docker-entrypoint.shdump.sql将执行。