码头工人-码头工人运行-总是重新启动实际上是做什么的?

Joe*_*oeG 6 docker

尽管--restart标志看起来很简单明了,但是在尝试使用它时我提出了许多问题:

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

Cha*_*nka 8

要为容器配置重启策略,请在使用 docker run 命令时使用 --restart 标志。--restart 标志的值可以是以下任何一项:

no 不要自动重启容器。(默认)

on-failure 如果容器因错误而退出,则重新启动容器,该错误表现为非零退出代码。

always 如果容器停止,请始终重新启动容器。如果是手动停止,则只有在Docker daemon重启或容器本身手动重启时才会重启。

unless-stopped 与 类似always,除了当容器停止(手动或其他方式)时,即使在 Docker 守护程序重新启动后也不会重新启动。

以下示例启动 Redis 容器并将其配置为始终重新启动,除非它明确停止或重新启动 Docker。

$ docker run -d --restart unless-stopped redis
Run Code Online (Sandbox Code Playgroud)

此命令更改名为 redis 的已运行容器的重启策略。

$ docker update --restart unless-stopped redis
Run Code Online (Sandbox Code Playgroud)

并且此命令将确保所有当前运行的容器将重新启动,除非停止。

$ docker update --restart unless-stopped $(docker ps -q)
Run Code Online (Sandbox Code Playgroud)

重启策略详情

使用重启策略时请记住以下几点:

  • 重启策略只有在容器启动成功后才会生效。在这种情况下,成功启动意味着容器至少启动了 10 秒,并且 Docker 已经开始监控它。这可以防止根本没有启动的容器进入重启循环。
  • 如果您手动停止一个容器,它的重启策略将被忽略,直到 Docker 守护进程重启或容器被手动重启。这是防止重新启动循环的另一种尝试。
  • 重启策略仅适用于容器。群服务的重启策略配置不同。

文档

  • 如果退出代码指示失败,on-failure 将重新启动,&unless-stopped 的行为与往常一样,并且将保持实例运行,除非容器停止。尝试使用 hello-world 看看有什么不同。docker run --restart on-failure hello-world 将运行一次并成功退出,运行后续的 docker ps 将指示当前没有正在运行的容器实例。但是,即使容器成功退出, docker run --restart except-stopped hello-world 也会重新启动容器,因此运行 docker ps 将显示重新启动,直到停止容器为止。 (3认同)

Har*_*llo 5

重新启动政策

在Docker运行时使用--restart标志,您可以指定重启策略,以指定容器在退出时应如何重启。

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

docker run-总是

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

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

重新启动政策

重新启动策略-详细信息

  • 所以我在提问之前有 RTFM - 这个答案实际上根本没有解决我的任何问题!这些链接甚至都没有提到容器的入口点。是否执行,传递什么参数?其中一个链接的引用说:“[重新启动无限期地继续,] 或当您 docker stop 或 docker rm -f 容器时”。但是,如果我执行 docker kill 则不会重新启动。 (4认同)
  • docker 19.x 中删除了 `--always` 标志 (3认同)

Joe*_*oeG 5

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

FROM officialImage:version

ENV envOne=value1  \
    envTwo=value2
COPY wrapper-entrypoint.sh /
ENTRYPOINT ["/wrapper-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
set -x

echo "Be pedantic: all args passed: $@"
bash -x ./original-entrypoint.sh "$@"
Run Code Online (Sandbox Code Playgroud)

由此我发现:

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