首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Docker Compose中加载数据前等待Postgres准备就绪

如何在Docker Compose中加载数据前等待Postgres准备就绪
EN

Stack Overflow用户
提问于 2020-06-18 05:42:06
回答 1查看 248关注 0票数 0

我有一个简单的Docker编写文件:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
exec /data_load.sh &
exec /docker-entrypoint.sh

我的data_load.sh

代码语言:javascript
复制
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时,我得到:

代码语言:javascript
复制
...
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秒打印一次。关于我做错了什么的想法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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脚本,并且可以保证数据库在该特定点运行。因此,如果您将加载器脚本减少到

代码语言:javascript
复制
#!/bin/sh
exec /load_data.py

并将其复制到正确的目录中

代码语言:javascript
复制
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容器中运行它也是合理的,或者使用您的应用程序的数据库迁移系统。(由于模式偶尔会发生变化,因此最好将数据库本地设置限制为创建初始用户和数据库,其余工作留给您的应用程序代码完成。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62438834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档