尽管--restart标志看起来很简单明了,但是在尝试使用它时我提出了许多问题:
ENTRYPOINT定义-重新启动期间实际定义的语义是什么?exec进入容器(我在DDC上)并杀死-9,该过程将重新启动,但是如果我不docker kill这样做,则重新启动。为什么?要为容器配置重启策略,请在使用 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)
重启策略详情
使用重启策略时请记住以下几点:
重新启动政策
在Docker运行时使用--restart标志,您可以指定重启策略,以指定容器在退出时应如何重启。
当容器上的重启策略处于活动状态时,它将在docker ps中显示为“启动”或“正在重启”。使用docker事件来查看生效的重启策略也很有用。
docker run-总是
无论退出状态如何,请始终重新启动容器。当您始终指定时,Docker守护程序将尝试无限期重启容器。无论容器的当前状态如何,该容器还将始终在守护程序启动时启动。
我向您推荐有关重启策略的本文档
我今天有一些时间对此进行了更多调试 -> 因为我使用的是“官方”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根据给定脚本在重新启动时的条件可能采取的操作进行保存。| 归档时间: |
|
| 查看次数: |
4225 次 |
| 最近记录: |