我有一个简单的Docker编写文件:
version: "3"
volumes:
pg-data:
services:
db:
image: postgis/postgis
build: ./postgis
volumes:
- pg-data:/var/lib/postgresql
ports:
- 5432:5432
restart: on-failure我的Dockerfile
FROM postgis/postgis
USER root
COPY docker-entrypoint.sh /docker-entrypoint.sh
COPY data_load.sh /data_load.sh
RUN chmod +x /*.sh
ENTRYPOINT ["/docker-entrypoint.sh"]我的docker-entrypoint.sh
exec /data_load.sh &
exec /docker-entrypoint.sh我的data_load.sh
until pg_isready -h localhost -p 5432
do
printf 'PostgreSQL not ready! \n'
sleep 15
done
echo "Loading data"
python /load_data.py &&
echo "Data load complete!"当运行docker-compose up --build时,我得到:
...
Successfully built 88b291d6b47e
Successfully tagged postgis/postgis:latest
Creating my_compose_db_1 ... done
Attaching to my_compose_db_1
db_1 | Starting script to add data
db_1 | localhost:5432 - no response
db_1 | PostgreSQL not ready yet, trying again in 15 seconds 问题是Postgres永远不会启动!执行data_load.sh脚本,因为我可以看到“PostgreSQL is not ready!”每15秒打印一次。关于我做错了什么的想法?
发布于 2020-06-18 07:35:47
在您拥有的脚本设置中,任何东西都不会运行基本映像的入口点。您提供自己的脚本作为/docker-entrypoint.sh,该脚本通过重新运行自身而结束。(/usr/local/bin/docker-entrypoint.sh中的postgres基本映像puts its entrypoint script。)
对于PostgreSQL导出的映像,可以使用简单得多的设置。在第一次初始化时,标准postgres映像将在/docker-entrypoint-initdb.d中运行任何*.sql或*.sh脚本,并且可以保证数据库在该特定点运行。因此,如果您将加载器脚本减少到
#!/bin/sh
exec /load_data.py并将其复制到正确的目录中
FROM postgis/postgis
COPY data_load.sh /docker-entrypoint-initdb.d/data_load.sh
COPY load_data.py /load_data.py
RUN chmod +x /docker-entrypoint-initdb.d/data_load.sh /load_data.py
# And use the base image's ENTRYPOINT/CMD您根本不需要手动编写此脚本。
如果脚本是一个更复杂的数据库种子作业,那么从一个完全独立的Docker容器中运行它也是合理的,或者使用您的应用程序的数据库迁移系统。(由于模式偶尔会发生变化,因此最好将数据库本地设置限制为创建初始用户和数据库,其余工作留给您的应用程序代码完成。)
https://stackoverflow.com/questions/62438834
复制相似问题