为什么我的 Docker 容器之一没有在机器启动时自动启动?
Why does one of my Docker containers not start automatically on machine boot?
我有两个 Docker 容器,一个到 运行 一个 Jenkins 实例,一个到 运行 YouTrack 。它们各自的启动脚本如下所示:
詹金斯:docker run --name jenkins_master --restart on-failure -p 8080:8080 -p 50000:50000 -v /home/ci/jenkins_home/:/var/jenkins_home -d jenkins:latest
YouTrack:docker run --name youtrack --restart on-failure -p 8081:80 -v /home/ci/youtrack/data/:/opt/youtrack/data/ -v /home/ci/youtrack/backup/:/opt/youtrack/backup -d uniplug/youtrack
如你所见,没什么特别的,一些端口映射和一些-v
。
我希望它们在我启动 PC 时启动 运行ning。 The Docker documenation says "Docker 提供重启策略来控制您的容器是在退出时自动启动,还是在 Docker 重启时自动启动。"
作为 Docker "restarts" 当我启动我的机器时,由于 --restart on-failure
,我假设两个容器在启动时都是 运行。但是只有 Jenkins 在端口 8080 上启动到 运行,我必须在重启机器时手动启动 YouTrack。
如何避免手动启动容器?
当您重新启动 PC 时,docker 守护程序所做的是尝试停止 运行ning 容器。这就像所有 运行ning 容器上的 运行ning docker stop
,这就是发生的事情(取自 here):
When you issue a docker stop command Docker will first ask nicely for
the process to stop and if it doesn't comply within 10 seconds it will
forcibly kill it. If you've ever issued a docker stop and had to wait
10 seconds for the command to return you've seen this in action
The docker stop command attempts to stop a running container first by
sending a SIGTERM signal to the root process (PID 1) in the container.
If the process hasn't exited within the timeout period a SIGKILL
signal will be sent.
对于您的容器,您指定了 --restart on-failure
,这意味着 docker 守护进程将仅在容器退出时退出状态 > 0 时才重新启动您的容器。我对你的问题的猜测是你的 youtrack 容器正确地响应 docker 守护进程给出的 SIGTERM 信号并干净地退出(退出状态 0)。另一方面,jenkins 容器并没有干净地退出。因此,只有 jenkins 容器在重启时重启。
要解决此问题,您可以 运行 带有 --restart always
标志的容器,无论如何容器都会重新启动。
我有两个 Docker 容器,一个到 运行 一个 Jenkins 实例,一个到 运行 YouTrack 。它们各自的启动脚本如下所示:
詹金斯:
docker run --name jenkins_master --restart on-failure -p 8080:8080 -p 50000:50000 -v /home/ci/jenkins_home/:/var/jenkins_home -d jenkins:latest
YouTrack:
docker run --name youtrack --restart on-failure -p 8081:80 -v /home/ci/youtrack/data/:/opt/youtrack/data/ -v /home/ci/youtrack/backup/:/opt/youtrack/backup -d uniplug/youtrack
如你所见,没什么特别的,一些端口映射和一些-v
。
我希望它们在我启动 PC 时启动 运行ning。 The Docker documenation says "Docker 提供重启策略来控制您的容器是在退出时自动启动,还是在 Docker 重启时自动启动。"
作为 Docker "restarts" 当我启动我的机器时,由于 --restart on-failure
,我假设两个容器在启动时都是 运行。但是只有 Jenkins 在端口 8080 上启动到 运行,我必须在重启机器时手动启动 YouTrack。
如何避免手动启动容器?
当您重新启动 PC 时,docker 守护程序所做的是尝试停止 运行ning 容器。这就像所有 运行ning 容器上的 运行ning docker stop
,这就是发生的事情(取自 here):
When you issue a docker stop command Docker will first ask nicely for the process to stop and if it doesn't comply within 10 seconds it will forcibly kill it. If you've ever issued a docker stop and had to wait 10 seconds for the command to return you've seen this in action
The docker stop command attempts to stop a running container first by sending a SIGTERM signal to the root process (PID 1) in the container. If the process hasn't exited within the timeout period a SIGKILL signal will be sent.
对于您的容器,您指定了 --restart on-failure
,这意味着 docker 守护进程将仅在容器退出时退出状态 > 0 时才重新启动您的容器。我对你的问题的猜测是你的 youtrack 容器正确地响应 docker 守护进程给出的 SIGTERM 信号并干净地退出(退出状态 0)。另一方面,jenkins 容器并没有干净地退出。因此,只有 jenkins 容器在重启时重启。
要解决此问题,您可以 运行 带有 --restart always
标志的容器,无论如何容器都会重新启动。