我有关于docker和postgres的问题。每次docker启动时我都会设置一个新的postgres数据库并想要导入给定的转储。
我的问题就像,但答案对我来说还不够:Docker postgres does not run init file in docker-entrypoint-initdb.d
多克尔-撰写:
postgres:
environment:
- POSTGRES_USER=****
- POSTGRES_PASSWORD=****
- POSTGRES_DB=****
build:
context: .
dockerfile: dockerfile-postgres
我的Dockerfile :(我已经尝试使用.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
除了我测试我的数据库是否已导入,我的数据库中没有表。我做错了什么(文件在目标系统上读取和执行)?用psql导入它没问题,所以我的转储是正确的。
我希望你能帮助我,我想提前感谢你。
答案 0 :(得分:13)
好的,我找到了诀窍,我必须执行" docker-compose rm"为了执行此文件夹中的脚本和sql文件。一旦构建并且未被删除,则忽略init文件夹。
<强>更新强> 我再次遇到这个问题,这次删除图像docker创建解决了问题。
答案 1 :(得分:-1)
这种情况正在发生,因为很可能是
然后,负责按字母顺序运行docker-entryfile.sh
文件的initdb脚本/docker-entrypoint-initdb.d/*
仅在创建卷时才首次运行。
您可以看到一些详细信息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)删除postgres_service docker service附带的卷/卷(/Users/yogesh.yadav/DockerData/datahub/postgresql/data)。您可以手动或通过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
将会执行。
答案 2 :(得分:-1)
这里的答案为我解决了一些问题,但是使docker-entrypoint-initdb/*.sql
脚本正常工作的最后一步是确保sql脚本本身没有语法问题(我遇到了问题,因为我更改了SQL版本我的Dockerfile)。
如果存在,docker-entrypoint-initdb/*.sql
脚本中的所有内容似乎都会回滚。
要检查是否存在语法脚本问题(或其他问题),您可能会发现查看docker日志很有用:
$ docker ps -all
注意:-all
确保列出了可能也无法启动的那些图像。
找到您刚刚创建的图像,并查找应该是12个字符的哈希的容器ID:
$ docker logs baf32ff7ec03
请记住,您仍然需要遵循此处的其他答案-删除以前构建的图像并删除数据文件夹(如果需要,请备份它)。