gpt4 book ai didi

database - 如何让docker等待/docker-entrypoint-initdb.d里面的SQL脚本被执行

转载 作者:行者123 更新时间:2023-12-05 06:00:19 25 4
gpt4 key购买 nike

我在 docker-compose.yml 中使用两个服务对一个应用程序进行 docker 化:一个是从 php:7.3.28-apache 构建的网络图像,另一个是从 postgres:11.12-alpine 构建的数据库图像。在数据库 Dockerfile 中,我正在执行一个 sql 文件来填充数据库:

COPY ./dump.sql/docker-entrypoint-initdb.d/

在我的网络图像中,我进行了迁移。但是迁移应该只发生在数据库结束执行 sql 文件之后。所以我使用 wait-for-it.sh 脚本等待数据库端口可用:

CMD composer install ; wait-for-it -t 0 db:5432 -- bin/console doctrine:migrations:migrate ; apache2-foreground

问题是端口 db:5432 在 dump.sql 文件结束执行之前变得可用。

我已经试过了

depends_on:
- db

在 docker-compose.yml 中,问题仍然存在。有没有办法锁定端口 db:5432 直到转储完成,或者有办法让 Web 服务等待数据库服务中转储执行的结束?

最佳答案

解决方案是利用HEALTHCHECK [OPTIONS] CMD 命令

CMD 关键字后的命令可以是 shell 命令(例如 HEALTHCHECK CMD/bin/check-running)或 exec 数组(与其他 Dockerfile 命令一样;参见 ENTRYPOINT 了解详细信息) .

命令的退出状态表示容器的健康状态。可能的值是:

0:成功 - 容器健康并可以使用

1:不健康——容器没有正常工作

2: reserved - 不要使用这个退出代码

也许你可以创建一些 shell 脚本

#!/bin/sh

# if your last table exists we assume may be
# we are now ready for migration
# put whatever logic you have to ensure data import was successful

# if file exits then exit code 0 else exit code 1
[ -f "/path/to/my/last/table" ] && exit 0 || exit 1

在 docker-compose.yml 中你需要

depends_on:
database:
condition: service_healthy

关于database - 如何让docker等待/docker-entrypoint-initdb.d里面的SQL脚本被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67710141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com