如何在succesfull等待脚本后启动docker容器

问题描述:

我正在使用wait-for-it脚本来检查数据库是否已启动,然后再启动我的其他应用程序。我发现这个脚本here。 现在我的应用程序容器停止运行,与MySQL is up - executing command。 所以脚本成功了(数据库正在运行),但我不清楚如何执行我的应用程序的dockerfile中的真正CMD(脚本之后)。如何在succesfull等待脚本后启动docker容器

这是我dockerfile结束:

COPY docker-entrypoint.sh /entrypoint.sh 
COPY ./wait-for-it.sh wait-for-it.sh 
ENTRYPOINT ["/entrypoint.sh"] 

EXPOSE 2368 
CMD ["npm", "start"] 
+0

您可以删除'ENTRYPOINT'并将它们放在'CMD'中:'CMD /entrypoint.sh && npm start'。 –

+0

嗨,我做了你说的,但它似乎仍然无法执行成功的psql检查后CMD命令。所以图像是建立的,我的docker-compose执行wait-for-it脚本,它是成功的,所以我的容器可以启动,但它出错了。什么都没有发生 – DenCowboy

+0

我认为等待脚本需要参数。尝试'/entrypoint.sh localhost npm start'。对不起,我现在无法测试,因为我没有Linux机器。 –

让我们澄清一些事情第一。当您在Dockerfile中同时使用ENTRYPOINTCMD时,CMD值将作为参数传递给ENTRYPOINT。所以你目前在文件中的转换为

/entrypoint.sh npm start 

这是在启动容器时执行的。在不知道entrypoint.sh中发生了什么的情况下,很难说出这有什么影响。

泊坞

你可以做以下更改,请试试这个:

  • Dockerfile取出ENTRYPOINT
  • 更改CMD以下几点:

    CMD /wait-for-it.sh localhost && /entrypoint.sh npm start 
    

如果这样做,请调整如下:

  • wait-for-it.sh的路径 - 请调整无论你正在复制脚本文件在Dockerfile中。我建议你将它复制到与entrypoint.sh相同的文件夹中。
  • localhost参数为wait-for-it.sh脚本文件,请用您的数据库主机替换。

上面做什么,在运行wait-for-it.sh脚本,然后,一旦数据库已启动,它运行您在ENTRYPOINTCMD了前面的命令。它应该与您目前拥有的相媲美。

作为替代方法,您也可以从entrypoint.sh脚本中调用wait-for-it.sh脚本,并且只运行其他步骤(npm start,等待脚本成功后)。给你......

多克尔 - 撰写

如果您使用的码头工人,撰写了启动你的容器,可以在容器开始使用command属性,在docker-compose.yaml文件覆盖所执行的命令,例如

command: > 
    bash -c " 

    /wait-for-it.sh localhost 
    && /entrypoint.sh npm start 
    " 

请注意,开始使用自己选择的外壳(巴什在这种情况下)

  • 引号多个命令使用

    • bash -c,你会需要它们具有多条线路。

    使用这种方法,您基本上可以链接多个命令以相互运行,并使用运算符&&进行组合。

    等待换它脚本

    顺便说一句:我用这个wait-for-it script用于与上述相同的方式良好的结果类似的目的。它比等待脚本的版本略强,并且几乎支持任何主机/端口组合。我用它来等待MySQL - 你的问题不清楚它是关于MySQL还是PostgreSQL。

  • +0

    感谢您的回复。我使用的是mysql,但脚本是从docker文档复制的,但适用于mysql并且运行良好。我也尝试用docker-compose启动它,所以我仍然需要编辑dockerfile? – DenCowboy

    +0

    我已经更新了有关Docker-Compose一节的答案 – nwinkler