我有一个带有docker-compose这样的容器
services:
app:
build:
context: app
restart: always
version: '3.5'
它启动节点应用docker-compose run -d --name my-app app node myapp.js
使该应用运行至完成或抛出,然后目标是使Docker无限循环地重启它,而不考虑退出代码。我不确定为什么,但是它不会重新启动。
我该如何调试?我不知道节点正在发送什么退出代码,也不知道码头工人决定使用哪个退出代码重新启动。
我也在Mac上,尚未在Linux上进行测试。编辑:它确实在Linux上重新启动,没有其他Mac来查看行为是否仅与我的Mac隔离。
答案 0 :(得分:1)
重要的是要理解以下两个概念:
结束您的Node应用程序并不意味着您的容器已结束。您的容器从您的操作系统运行一个共享进程,而您的Node应用程序只是该进程的一个子进程。 (假设您的应用程序与Deamon一起运行)
restart
表示“启动”策略-它永远不会终止并再次启动您的容器。
话虽如此,您需要的是一种可以真正从应用程序内部重新启动容器的方法。最好的方法是通过Docker运行状况检查:
https://docs.docker.com/engine/reference/builder/#healthcheck
或者,这是有关从应用程序内部重新启动容器的一些答案。
答案 1 :(得分:0)
从Github Issue开始似乎不尊重`--restart``,或者从@Charlie注释开始似乎在各个平台之间都不同。
docker-compose run命令用于运行“一次性”或“ adhoc” 任务。run命令的作用类似于
docker run -ti
,它打开了容器的交互式终端并返回与容器中进程的退出状态匹配的退出状态。
如果它像docker run -it
一样,那么我没有看到restart=always
的选项,但是它应该遵循compose的“ restart`选项”。
Usage:
run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...]
SERVICE [COMMAND] [ARGS...]
Options:
-d, --detach Detached mode: Run container in the background, print
new container name.
--name NAME Assign a name to the container
--entrypoint CMD Override the entrypoint of the image.
-e KEY=VAL Set an environment variable (can be used multiple times)
-l, --label KEY=VAL Add or override a label (can be used multiple times)
-u, --user="" Run as specified username or uid
--no-deps Don't start linked services.
--rm Remove container after run. Ignored in detached mode.
-p, --publish=[] Publish a container's port(s) to the host
--service-ports Run command with the service's ports enabled and mapped
to the host.
--use-aliases Use the service's network aliases in the network(s) the
container connects to.
-v, --volume=[] Bind mount a volume (default [])
-T Disable pseudo-tty allocation. By default `docker-compose run`
allocates a TTY.
-w, --workdir="" Working directory inside the container