【问题标题】:How to restart an existing Docker container in restart="always" mode?如何以 restart="always" 模式重新启动现有的 Docker 容器?
【发布时间】:2015-06-18 15:44:38
【问题描述】:

当您最初从映像运行 Docker 容器时,您可以指定选项:

--restart="always"

这可确保容器在由于某种原因停止时始终由 Docker 守护程序重新启动。所以你可以像这样运行一个容器:

docker run --restart="always" <IMAGE>

您还可以通过指定容器 ID 来重新启动现有的 Docker 容器,即:

docker start <CONTAINER ID>

但我无法确定是否可以更改现有容器(最初未使用 --restart="always" 选项运行),以将其转换为将来始终重新启动。

目前我能想到的唯一方法是将容器保存为新图像,然后使用--restart="always" 选项将该图像作为新容器运行。这实际上是正确的方法吗?

编辑:我可能最初没有说清楚的是我正在考虑容器自最初运行以来发生变化的情况,需要持久化。所以仅仅从原始镜像运行一个新容器是不够的。

【问题讨论】:

标签: docker


【解决方案1】:

我们现在有了 docker update,它允许更改正在运行的容器的重启策略。

docker update --restart=always <CONTAINER ID>

还有其他三个选项:

  • 否(默认)
  • 失败时
  • 除非停止

详情请参考link

【讨论】:

  • 这是在哪个版本的 Docker 中引入的?
  • 从 1.11.0 版本开始可用。
  • 为什么我们在风筝上看不到有人知道?
【解决方案2】:

好的,所以回答我自己的问题,似乎不可能只用--restart=always 重新启动同一个容器,因为这是您在运行容器时必须做的事情第一次,而不是您启动现有容器时可以使用的参数。

对此有三种可能的解决方法:

  1. 正如@user2915097 所说,你可以放弃原来的容器(停止它然后用docker rm &lt;CONTAINER ID&gt;删除它来整理)。然后从原始镜像运行一个新容器,这次指定-restart=always 选项。
  2. 如果没有使用任何卷,因此更改在容器内部,您需要将容器提交到新映像,然后从该映像运行新容器。

    docker commit &lt;CONTAINER ID&gt; &lt;NEW IMAGE NAME&gt;

    docker run -d --restart=always ... &lt;NEW IMAGE NAME&gt;

  3. 如果使用了卷并且所有更改都仅限于卷,那么您可以使用 --volumes-from 参数运行第二个容器,而无需提交新版本的映像。即

    • docker stop &lt;CONTAINER 1 NAME&gt;
    • docker run -d --restart=always --volumes-from &lt;CONTAINER 1 NAME&gt; ... &lt;ORIGINAL IMAGE NAME&gt;

    然后删除容器 1 是安全的,因为卷不会被删除,而另一个容器继续使用它们。

我想还有第四种可能性;如果您使用了一个卷并且,您知道已经对不在卷上的容器进行了更改,那么您必须结合使用 (2) 和 (3 )。

【讨论】:

    【解决方案3】:

    更新:这有助于重新启动。但是将其设置回 no 并且它会重置回 always 并且容器会再次启动! :( 我将把这个答案留在这里,以防有人弄清楚这是如何工作的。我一定很接近!

    伙计们,我找到了绕过复制容器等的最 hacky 解决方案。

    vi /var/lib/docker/containers/$(docker inspect -f '{{ .Id }}' $ContainerID)/hostconfig.json

    搜索“重启策略”。将其设置为“否”、“始终”等

    也许有人可以将其封装在脚本中!?

    无论如何,那段 json 连同 config.json 将允许您修改创建容器时遗漏的各种内容。

    【讨论】:

    • 对任何尝试此操作的人提出警告,很多 Docker 的状态管理都假设它是唯一修改 /var/lib/docker 内容的东西。在此处进行更改时要非常小心。
    • 啊,是的,取决于进行了哪些更改以及哪些文件保持打开状态。为了安全起见,请随时停止 docker 引擎。我希望他们增加在后续版本中进行更改的能力。没有能力操纵重启策略真是太疯狂了。
    • 可能很快会添加新的设置功能。 github.com/docker/docker/pull/15078
    【解决方案4】:

    http://www.brandpending.com/blog/2014/11/21/setting-and-re-setting-the-restart-behaviour-of-a-docker-container中提取

    假设你想改变这个容器的重启策略 从总是到失败。为此,您需要停止容器, 删除它并使用新的重启策略重新运行它。

    【讨论】:

    • 但是这样做的问题是您将丢失原始容器中的任何更改,因为您已将其删除并从头开始创建一个新容器。我敢肯定,如果原始容器中有任何需要保留的更改,那么提交一个新图像并从中运行一个新容器会更好。
    • 所以我们回到你的承诺
    • @rdc 您应该尽量避免因为这样的事情而在容器中进行更改 - 将其保存在卷或某种数据库中。
    • 此答案不再相关,请查看@Frank Wong 的答案
    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多