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

时间:2017-01-09 19:56:20

标签: docker

虽然看起来--restart标志简单明了,但在尝试时我想出了一些问题:

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

3 个答案:

答案 0 :(得分:5)

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

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

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

always如果容器停止,则始终重新启动它。如果是手动 停止,仅在Docker守护程序重启或 容器本身是手动重新启动的。

unless-stoppedalways相似,不同之处在于: 已停止(手动或其他方式),即使在Docker之后也不会重新启动 守护程序重新启动。

以下示例启动Redis容器并将其配置为始终重新启动,除非该容器已显式停止或重新启动Docker。

$ docker run -d --restart unless-stopped redis

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

$ docker update --restart unless-stopped redis

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

$ docker update --restart unless-stopped $(docker ps -q)

重启策略详细信息

使用重新启动策略时请注意以下几点:

  • 重新启动策略仅在容器成功启动后才生效。在这种情况下,成功启动意味着该容器已启动至少10秒钟,并且Docker已开始对其进行监视。这样可以防止根本无法启动的容器进入重启循环。
  • 如果手动停止容器,则其重新启动策略将被忽略,直到Docker守护程序重新启动或手动重新启动容器为止。这是防止重启循环的另一种尝试。
  • 重新启动策略仅适用于容器。群集服务的重启策略配置不同。

Documentation

答案 1 :(得分:2)

重新启动政策

在Docker上运行--restart标志,您可以指定一个重启策略,说明在退出时应该或不应该重新启动容器。

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

  

docker run --always

     

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

我建议您提供有关重新启动政策

的文档

Restart policies

Restart policies - more detail

答案 2 :(得分:0)

今天我有更多的时间来调试这个 - >因为我正在使用一位官员' docker image我几乎看不到正在发生的事情。为了解决这个问题,我扩展了官方图像并调用了我自己的入口点。 Dockerfile:

FROM officialImage:version

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

然后我做了一套#x'在wrapper-entrypoint.sh脚本中并调用原始文件:

#!/bin/bash
set -x

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

从此我发现:

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