我在 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/