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

标签 database docker docker-compose dockerfile database-migration

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

相关文章:

mysql_install_db 给出错误

docker - 组成具有不同基础的多个Docker镜像的最佳方法是什么

docker - 对 docker 的 -i "Keep STDIN open even if not attached"感到困惑

mysql - 我如何让 Lando mysql portforward 与 lamp 配方一起工作

docker - 来自 docker-compose.yml 入口点中 env 文件的环境变量

python - 如何在 docker 容器中打开 jupyter nookbooks?

PHP坏词替换评论系统

mysql - Sequelize 中每个 api 调用期间的动态数据库连接,其中有 'n' 没有数据库

sql - 查找每个 GROUP BY 结果中的行数

docker - docker 是否总是需要操作系统作为基本镜像