当您最初从图像运行Docker容器时,您可以指定选项:
--restart="always"
这确保了Docker守护程序始终重新启动容器,如果由于某种原因它停止。所以你可以像这样运行一个容器:
docker run --restart="always" <IMAGE>
您还可以通过指定容器ID来重新启动现有的Docker容器,即:
docker start <CONTAINER ID>
但是我无法确定是否可以更改现有容器(最初未使用--restart="always
选项运行),以便将其转换为将来始终重新启动。
目前,我认为这样做的唯一方法是将容器保存为新图像,然后将该图像作为具有--restart="always"
选项的新容器运行。这实际上是这样做的正确方法吗?
编辑:我最初可能没有说清楚的是,我正在考虑自最初运行以来容器发生变化的情况,这需要是持续存在。因此,仅从原始图像运行新容器是不够的。
答案 0 :(得分:80)
我们现在有了docker update,它允许更改正在运行的容器的重启策略。
docker update --restart=always <CONTAINER ID>
还有其他三个选择:
有关详细信息,请参阅link。
答案 1 :(得分:14)
好的,所以要回答我自己的问题,似乎只能用--restart=always
重新启动同一个容器,因为当你首次运行容器,而不是启动现有容器时可以使用的参数。
有三种可能的解决方法:
docker rm <CONTAINER ID>
将其删除以整理)。然后只需从原始图像运行一个新容器,此时指定-restart=always
选项。如果没有使用卷,那么更改是容器内部的,您需要将容器提交到新映像,然后从该映像运行新容器。
docker commit <CONTAINER ID> <NEW IMAGE NAME>
docker run -d --restart=always ... <NEW IMAGE NAME>
如果使用了卷并且所有更改都仅限于卷,则可以使用--volumes-from
参数运行第二个容器,而无需提交新版本的映像。即。
docker stop <CONTAINER 1 NAME>
docker run -d --restart=always --volumes-from <CONTAINER 1 NAME> ... <ORIGINAL IMAGE NAME>
删除容器1是安全的,因为在另一个容器继续使用它们时不会删除卷。
我想还有第四种可能性;如果你使用了一个和卷,你知道容器上没有对卷进行更改,那么你必须使用(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)
因此,假设您要更改此容器的重新启动策略 从永远到失败。为此,您需要停止容器, 删除它并使用新的重新启动策略重新运行它。