当您最初从映像运行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
重新启动同一个容器似乎是不可能的,因为这是你第一次运行容器时必须做的事情,而不是你启动现有容器时可以使用的参数。
有三种可能的解决方法:
- 正如@user2915097所说,您可以放弃原始容器(停止它,然后用
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)和(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
假设您想更改此容器的重新启动策略从总是失败到失败。为此,您需要停止容器,删除它,然后使用新的重新启动策略重新运行它。