如何在restart ="中重新启动现有的Docker容器"模式?

时间:2015-04-13 10:49:33

标签: docker

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

--restart="always"

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

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

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

docker start <CONTAINER ID>

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

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

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

4 个答案:

答案 0 :(得分:80)

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

docker update --restart=always <CONTAINER ID>

还有其他三个选择:

  • 否(默认)
  • 接通故障
  • 除非-停止

有关详细信息,请参阅link

答案 1 :(得分:14)

好的,所以要回答我自己的问题,似乎只能用--restart=always重新启动同一个容器,因为当你首次运行容器,而不是启动现有容器时可以使用的参数。

有三种可能的解决方法:

  1. 正如@ user2915097所述,您可以放弃原始容器(停止它然后使用docker rm <CONTAINER ID>将其删除以整理)。然后只需从原始图像运行一个新容器,此时指定-restart=always选项。
  2. 如果没有使用卷,那么更改是容器内部的,您需要将容器提交到新映像,然后从该映像运行新容器。

    docker commit <CONTAINER ID> <NEW IMAGE NAME>

    docker run -d --restart=always ... <NEW IMAGE NAME>

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

    • docker stop <CONTAINER 1 NAME>
    • docker run -d --restart=always --volumes-from <CONTAINER 1 NAME> ... <ORIGINAL IMAGE NAME>

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

  4. 我想还有第四种可能性;如果你使用了一个卷,你知道容器上没有对卷进行更改,那么你必须使用(2)的组合(2) )和(3)。

答案 2 :(得分:3)

更新:这有助于重启。但是将其设置为no并将其重置为always并且容器再次启动! :(我将在这里留下这个答案,万一有人知道这是如何运作的。我一定要近了!

伙计们,我找到了解决复制容器等问题的最苛刻的解决方案。

  

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

搜索“RestartPolicy”。将其设置为“no”,“always”等

也许有人可以把它包装在脚本中!?

无论如何,那条json和config.json将允许你修改你在创建容器时错过的各种东西。

答案 3 :(得分:0)

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

  

因此,假设您要更改此容器的重新启动策略   从永远到失败。为此,您需要停止容器,   删除它并使用新的重新启动策略重新运行它。