Database 如何使docker等待/docker entrypoint initdb.d中的SQL脚本执行

Database 如何使docker等待/docker entrypoint initdb.d中的SQL脚本执行,database,docker,docker-compose,dockerfile,database-migration,Database,Docker,Docker Compose,Dockerfile,Database Migration,我使用docker-compose.yml中的两个服务来对接一个应用程序:从php:7.3.28-apache构建的web映像和从postgres:11.12-alpine构建的数据库映像。在数据库Dockerfile中,我正在执行一个sql文件,通过执行以下操作填充数据库: COPY./dump.sql/docker entrypoint initdb.d/ 在我的网络映像中,我进行了迁移。但是迁移应该只在数据库结束执行sql文件之后发生。因此,我使用wait-for-it.sh脚本等待数据库

我使用docker-compose.yml中的两个服务来对接一个应用程序:从php:7.3.28-apache构建的web映像和从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服务在db服务中等待转储执行结束?

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

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

sql文件在数据库中执行得很好,所以填充步骤还可以。我的问题是,我只想在“反驳”转储文件之后进行迁移。由于迁移命令在web服务中调用,因此我希望web服务以某种方式等待db服务。我曾考虑在web服务中使用sleep,但它似乎不是一个好的解决方案。