Docker-编写 Postgresql 导入转储
Docker-Compose Postgresql import dump
我有一个关于 docker 和 postgres 的问题。每次 docker 启动并想要导入给定的转储时,我都在设置一个新的 postgres 数据库。
我的问题是,但答案对我来说还不够:Docker postgres does not run init file in docker-entrypoint-initdb.d
Docker-撰写:
postgres:
environment:
- POSTGRES_USER=****
- POSTGRES_PASSWORD=****
- POSTGRES_DB=****
build:
context: .
dockerfile: dockerfile-postgres
我的 Docker 文件:(我已经用 .sh 结尾的脚本试过了)
FROM postgres
ADD dump.sql /docker-entrypoint-initdb.d/
根据https://hub.docker.com/_/postgres/ dump.sql 必须使用导入数据库。
使用 docker 启动应用程序只给出:
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
另外我测试了我的数据库有没有导入,我的数据库里没有table。我做错了什么(文件在目标系统上被读取和执行table)?用psql导入没问题,所以我的转储是正确的。
希望你能帮助我,在此先感谢你。
好吧,我找到了诀窍,我必须执行 "docker-compose rm" 才能执行此文件夹中的脚本和 sql 文件。一旦构建但未删除,init 文件夹将被忽略。
更新
我 运行 再次遇到这个问题,这次删除 docker 创建的图像解决了问题。
它正在发生,因为很可能
initdb 脚本 docker-entryfile.sh
然后负责 运行ning /docker-entrypoint-initdb.d/*
文件按字母顺序排列 运行s 只有在创建卷时才第一次.
你可以看到一些细节here .
解决方案(适用于我)
这是我的 docker-compose 文件
中的片段
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) docker-compose -f docker-compose-filename.yml down
或
docker-compose -f docker-compose-filename.yml stop postgres_service
2) 移除 volume/volumes ( /Users/yogesh.yadav/DockerData/datahub/postgresql/data ) 附带 postgres_service docker 服务。您可以手动或通过 docker-compose rm
或 docker volume rm
执行此操作。在删除它之前,请确定附加到该 postgres 服务的卷。 More info here
3) Docker 通过构建图像并 运行 对它们使用非常好的缓存管理。如果您没有修改 Dockerfile
,docker 将从缓存中 运行 已经构建的图像并 运行 它。所以我建议也删除 postgres_service 的图像。
要列出图像
docker images -a
输出 -
REPOSITORY TAG IMAGE ID CREATED SIZE
datahub/postgres development e7707e670ad4 35 minutes ago 265 MB
删除该图像(如果需要,请使用 -f)
docker rmi IMAGE_ID_HERE
4) 再次重启您的服务
docker-compose -f docker-compose-filename.yml up --build postgres_service
这次你可以看到你的docker-entrypoint.sh
和dump.sql
会执行。
这里的答案在某种程度上解决了我的问题,但让 docker-entrypoint-initdb/*.sql
脚本正常工作的最后一步是确保 sql 脚本本身没有语法问题(我有问题因为我在 Dockerfile 中更改了 SQL 个版本。
如果存在,docker-entrypoint-initdb/*.sql
脚本中的所有内容似乎都会回滚。
要检查是否存在任何语法脚本问题(或其他问题),您可能会发现查看 docker 日志很有用:
$ docker ps -all
注意:-all
确保它列出了那些可能也无法启动的映像。
找到您刚刚创建的图像并查找应该是 12 个字符哈希的容器 ID:
$ docker logs baf32ff7ec03
请记住,您仍然需要按照此处的其他答案进行操作 - 即 rm 之前构建的图像并删除您的数据文件夹(如果需要,请备份)。
我有一个关于 docker 和 postgres 的问题。每次 docker 启动并想要导入给定的转储时,我都在设置一个新的 postgres 数据库。
我的问题是,但答案对我来说还不够:Docker postgres does not run init file in docker-entrypoint-initdb.d
Docker-撰写:
postgres:
environment:
- POSTGRES_USER=****
- POSTGRES_PASSWORD=****
- POSTGRES_DB=****
build:
context: .
dockerfile: dockerfile-postgres
我的 Docker 文件:(我已经用 .sh 结尾的脚本试过了)
FROM postgres
ADD dump.sql /docker-entrypoint-initdb.d/
根据https://hub.docker.com/_/postgres/ dump.sql 必须使用导入数据库。
使用 docker 启动应用程序只给出:
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
另外我测试了我的数据库有没有导入,我的数据库里没有table。我做错了什么(文件在目标系统上被读取和执行table)?用psql导入没问题,所以我的转储是正确的。
希望你能帮助我,在此先感谢你。
好吧,我找到了诀窍,我必须执行 "docker-compose rm" 才能执行此文件夹中的脚本和 sql 文件。一旦构建但未删除,init 文件夹将被忽略。
更新 我 运行 再次遇到这个问题,这次删除 docker 创建的图像解决了问题。
它正在发生,因为很可能
initdb 脚本 docker-entryfile.sh
然后负责 运行ning /docker-entrypoint-initdb.d/*
文件按字母顺序排列 运行s 只有在创建卷时才第一次.
你可以看到一些细节here .
解决方案(适用于我) 这是我的 docker-compose 文件
中的片段 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) docker-compose -f docker-compose-filename.yml down
或
docker-compose -f docker-compose-filename.yml stop postgres_service
2) 移除 volume/volumes ( /Users/yogesh.yadav/DockerData/datahub/postgresql/data ) 附带 postgres_service docker 服务。您可以手动或通过 docker-compose rm
或 docker volume rm
执行此操作。在删除它之前,请确定附加到该 postgres 服务的卷。 More info here
3) Docker 通过构建图像并 运行 对它们使用非常好的缓存管理。如果您没有修改 Dockerfile
,docker 将从缓存中 运行 已经构建的图像并 运行 它。所以我建议也删除 postgres_service 的图像。
要列出图像
docker images -a
输出 -
REPOSITORY TAG IMAGE ID CREATED SIZE
datahub/postgres development e7707e670ad4 35 minutes ago 265 MB
删除该图像(如果需要,请使用 -f)
docker rmi IMAGE_ID_HERE
4) 再次重启您的服务
docker-compose -f docker-compose-filename.yml up --build postgres_service
这次你可以看到你的docker-entrypoint.sh
和dump.sql
会执行。
这里的答案在某种程度上解决了我的问题,但让 docker-entrypoint-initdb/*.sql
脚本正常工作的最后一步是确保 sql 脚本本身没有语法问题(我有问题因为我在 Dockerfile 中更改了 SQL 个版本。
如果存在,docker-entrypoint-initdb/*.sql
脚本中的所有内容似乎都会回滚。
要检查是否存在任何语法脚本问题(或其他问题),您可能会发现查看 docker 日志很有用:
$ docker ps -all
注意:-all
确保它列出了那些可能也无法启动的映像。
找到您刚刚创建的图像并查找应该是 12 个字符哈希的容器 ID:
$ docker logs baf32ff7ec03
请记住,您仍然需要按照此处的其他答案进行操作 - 即 rm 之前构建的图像并删除您的数据文件夹(如果需要,请备份)。