我有两个Docker容器,一个用于运行 Jenkins 实例,另一个用于运行 YouTrack 。它们各自的起始脚本如下所示:
Jenkins: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
。
我希望他们在启动电脑时开始运行。 The Docker documenation says" Docker提供重启策略来控制容器在退出时或Docker重启时是否自动启动。"
作为Docker"重启"当我启动我的机器时,由于--restart on-failure
,我假设两个容器都在启动时运行。但只有 Jenkins 开始在端口8080上运行,我必须在重启机器时手动启动YouTrack。
如何避免手动启动容器?
答案 0 :(得分:4)
当您重新启动PC时,docker守护程序所做的是尝试停止正在运行的容器。这就像在所有正在运行的容器上运行docker stop
,这就是发生的情况(取自here):
当你发出一个docker stop命令时,Docker会先问好 停止的过程,如果它在10秒内不符合,它将会 强行杀死它。如果你曾经发过码头停车而不得不等待 命令返回10秒你已经看到了这个动作
docker stop命令首先尝试停止正在运行的容器 将SIGTERM信号发送到容器中的根进程(PID 1)。 如果进程在超时期限内没有退出,则为SIGKILL 信号将被发送。
对于您的容器,您指定了--restart on-failure
,这意味着仅当退出状态为>时,docker守护程序才会重新启动容器。他们退出时为0。我对你的问题的猜测是你的youtrack容器正确地对docker守护进程给出的SIGTERM信号作出反应并且干净地退出(退出状态0)。在另一侧,詹金斯容器不会干净地离开。因此,只有jenkins容器在重新启动时重新启动。
要解决此问题,您可以使用--restart always
标志运行容器,并且容器将在任何情况下重新启动。