如何在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"]
让我们澄清一些事情第一。当您在Dockerfile中同时使用ENTRYPOINT
和CMD
时,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
脚本,然后,一旦数据库已启动,它运行您在ENTRYPOINT
和CMD
了前面的命令。它应该与您目前拥有的相媲美。
作为替代方法,您也可以从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。
您可以删除'ENTRYPOINT'并将它们放在'CMD'中:'CMD /entrypoint.sh && npm start'。 –
嗨,我做了你说的,但它似乎仍然无法执行成功的psql检查后CMD命令。所以图像是建立的,我的docker-compose执行wait-for-it脚本,它是成功的,所以我的容器可以启动,但它出错了。什么都没有发生 – DenCowboy
我认为等待脚本需要参数。尝试'/entrypoint.sh localhost npm start'。对不起,我现在无法测试,因为我没有Linux机器。 –