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



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

--restart="always"

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

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

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

docker start <CONTAINER ID>

然而,我无法确定是否可以更改一个现有的容器,该容器最初没有使用--restart="always"选项运行,以将其转换为将来总是重新启动。

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

EDIT:我最初可能没有弄清楚的是,我考虑的是,自容器最初运行以来,容器中发生了一些更改,这些更改需要持久化。因此,仅仅从原始映像运行一个新容器是不够的。

我们现在有了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)的组合。

更新:这使重启生效。但是将其设置回"否",它将重置回"始终",容器将重新启动!:(我将把这个答案留在这里,以防有人弄清楚这是怎么回事。我一定很接近!

伙计们,我找到了最巧妙的解决方案,可以绕过复制容器等

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

搜索"RestartPolicy"。将其设置为"否"、"始终"等

也许有人可以把它写进剧本里!?

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

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

假设您想更改此容器的重新启动策略从总是失败到失败。为此,您需要停止容器,删除它,然后使用新的重新启动策略重新运行它。

最新更新