【问题标题】:Why does one of my Docker containers not start automatically on machine boot?为什么我的 Docker 容器之一不会在机器启动时自动启动?
【发布时间】:2018-02-15 20:27:07
【问题描述】:

我有两个 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 时开始运行。 The Docker documenation says "Docker 提供重启策略来控制容器是在退出时自动启动,还是在 Docker 重启时自动启动。"

当我启动我的机器时 Docker “重新启动”,由于--restart on-failure,我假设两个容器都在启动时运行。但是只有 Jenkins 开始在 8080 端口上运行,我必须在重新启动机器时手动启动 YouTrack。

如何避免手动启动容器?

【问题讨论】:

    标签: linux docker jenkins restart youtrack


    【解决方案1】:

    当您重新启动您的 PC 时,docker 守护进程所做的是尝试停止正在运行的容器。这就像在所有正在运行的容器上运行docker stop,这就是发生的事情(取自here):

    当您发出 docker stop 命令时,Docker 将首先很好地询问 停止的过程,如果它在 10 秒内不符合要求,它将 强行杀死它。如果您曾经发出过 docker stop 并且不得不等待 命令返回 10 秒,您已经看到了这一点

    docker stop 命令首先尝试通过以下方式停止正在运行的容器 向容器中的根进程(PID 1)发送 SIGTERM 信号。 如果进程在超时期限内没有退出 SIGKILL 将发送信号。

    对于您的容器,您指定了--restart on-failure,这意味着只有在容器退出时退出状态> 0 时,docker 守护程序才会重新启动您的容器。我对您的问题的猜测是您的 youtrack 容器正确地对 docker 守护程序给出的 SIGTERM 信号做出反应并干净地退出(退出状态 0)。在另一边,詹金斯容器没有干净地退出。因此,只有 jenkins 容器会在重启时重启。

    要解决此问题,您可以使用 --restart always 标志运行容器,并且无论如何容器都会重新启动。

    【讨论】:

    • 我已经想过将其设置为--restart always,并修复了它。感谢您提供更多信息! :)
    • 这是否也适用于--restart=unless-stopped
    • @Extrawurst 我想是这样,但不确定。不过很容易验证
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多