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

Ric*_*eld 42 docker

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

--restart="always"
Run Code Online (Sandbox Code Playgroud)

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

docker run --restart="always" <IMAGE>
Run Code Online (Sandbox Code Playgroud)

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

docker start <CONTAINER ID>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Fra*_*ong 85

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

docker update --restart=always <CONTAINER ID>
Run Code Online (Sandbox Code Playgroud)

还有其他三个选择:

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

有关详细信息,请参阅链接.

  • 它从版本1.11.0开始提供. (2认同)

Ric*_*eld 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是安全的,因为在另一个容器继续使用它们时不会删除卷.

我想还有第四种可能性; 如果您使用了一个卷,并且您知道容器中有不在卷上的更改,那么您将必须使用(2)和(3)的组合.