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

How to make docker wait for SQL script inside /docker-entrypoint-initdb.d to be executed

我正在 docker使用 docker-compose.yml 中的两个服务来构建一个应用程序:一个来自 php:7.3.28-apache 的 Web 图像构建和一个数据库图像构建来自 postgres:11.12-高山。在数据库 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 command

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

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

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

1:不健康 - 容器工作不正常

2:保留 - 不要使用此退出代码

也许你可以创建一些 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