如何重新启动一个现有的Docker容器在重启=“一直”模式?

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

--restart="always" 

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

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

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

 docker start <CONTAINER ID> 

然而,我不能确定是否有可能改变一个现有的容器,原来不是用--restart="always选项运行的,将它转换为总是在以后重新启动。

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

编辑 :我可能没有足够清楚,原来是我正在考虑的情况下,在容器已经发生了变化,因为它是最初运行,这需要坚持下去。 所以从原始图像只运行一个新的容器是不够的。

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

 docker update --restart=always <CONTAINER ID> 

还有三个选项:

  • 否(默认)
  • 在故障
  • 除非,停止

详情请参阅链接 。

好的,所以要回答我自己的问题,似乎不可能只用--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将是安全的,因为在另一个容器继续使用容器时不会删除容器。

我想也有第四种可能性。 如果您使用了卷, 并且您知道卷上没有容器的更改,则必须使用(2)和(3)的组合。

更新:这工作启用重启。 但是将其设置为no,并且将其重置为始终,并且容器再次启动! :(我要在这里留下这个答案,以防有人知道这是如何工作的,我必须靠近!

伙计们,我发现了最复杂的解决scheme,绕过复制容器等

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

search“RestartPolicy”。 设置为“否”,“一直”等

也许有人可以用脚本包装起来!

无论如何,这个json和config.json一起允许你修改创build容器时错过的各种东西。

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

所以假设你想把这个容器的重启策略从始终改变为失败。 要做到这一点,你需要停止容器,删除它,并重新运行新的重新启动策略。