Docker - \`docker run --restart always\` 实际上做了什么?

新手上路,请多包涵

尽管 –restart 标志看起来简单明了,但我在尝试它时提出了一些问题:

  1. 关于 ENTRYPOINT 定义 - 重启期间实际定义的语义是什么?
  2. 如果我 exec 进入容器(我在 DDC 上)并杀死 -9 进程,它会重新启动,但如果我这样做 docker kill 它不会。为什么?
  3. 重启如何与共享数据容器/命名卷交互?

原文由 JoeG 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 620
2 个回答

今天我有一些时间来调试这个 -> 因为我使用的是“官方” docker 镜像,所以我几乎看不到正在发生的事情。为了解决这个问题,我扩展了官方镜像并调用了我自己的入口点。 Dockerfile:

 FROM officialImage:version

ENV envOne=value1  \
    envTwo=value2
COPY wrapper-entrypoint.sh /
ENTRYPOINT ["/wrapper-entrypoint.sh"]

然后我在 wrapper-entrypoint.sh 脚本中做了一个“set -x”,并调用了原来的:

 #!/bin/bash
set -x

echo "Be pedantic: all args passed: $@"
bash -x ./original-entrypoint.sh "$@"

从这里我发现:

  • 重新启动确实使用原始参数调用原始 ENTRYPOINT 。我使用的官方图像检测到它已经初始化,因此行为不同。这就是为什么我对语义感到困惑的原因。使用 -x 让我看到了真正发生的事情。
  • 我仍然不知道为什么 docker kill 停止重新启动,但这就是我所看到的 - 至少在 Docker 数据中心。
  • 我不相信共享数据卷会以任何方式影响这一点,请保存给定的 ENTRYPOINT 脚本可能会根据重启时的状况采取的操作。

原文由 JoeG 发布,翻译遵循 CC BY-SA 3.0 许可协议

重启政策

在 Docker run 上使用 –restart 标志,您可以指定容器在退出时应该或不应该如何重新启动的重新启动策略。

当容器上的重启策略处于活动状态时,它将在 docker ps 中显示为 Up 或 Restarting。使用 docker events 查看生效的重启策略也很有用。

 docker run --always

无论退出状态如何,始终重新启动容器。当您指定 always 时,Docker 守护程序将尝试无限期地重新启动容器。无论容器的当前状态如何,容器也将始终在守护程序启动时启动。

我向您推荐有关 重启策略的 文档

文档 - 重启策略

更新 Docker v19.03

重启策略(–restart)

使用 Docker 的 –restart 来指定容器的重启策略。重启策略 > 控制 Docker 守护进程是否在退出后重启容器。 Docker 支持以下重启策略:

无论退出状态如何, 总是 重新启动容器。当您指定 always 时,Docker 守护程序将尝试无限期地重新启动容器。无论容器的当前状态如何,容器也将始终在守护程序启动时启动。

 $ docker run --restart=always redis

文档 - 重启策略

原文由 Harold Castillo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进