防止Docker-apt-get升级期间引擎重启

Prevent Docker-Engine restart during apt-get upgrade

我遇到了 Ubuntu 14.04

的问题

每当我进行 apt-get 升级时,如果 docker-engine 符合升级条件,它会在升级后重新启动服务。这会导致容器重新启动。

其中一个容器在启动期间需要手动干预,其他容器正在收集时间关键数据,因此仅需要在非常特定的时间重启容器。

如何从这些自动重启中排除 docker-engine 服务?

A​​FAIK,例如,mongodb,在 apt-get 升级后不会重启 mongod,为什么 docker 不能以同样的方式运行?

这是 deb 包中的 pre/post 安装脚本的设计以及构建包的人的决定(尽管将最新的 jessie 构建在 apt.dockerproject.org 上分开,我不是看到他们控制文件里面的stop,只有register和start)。

我能提出的最佳建议是,当您无法忍受任何停机时间时,不要运行 升级系统。通过之前仅下载 (apt-get upgrade -d) 来最大程度地缩短升级时间,然后在中断 window 期间开始升级。您还可以暂停 docker-engine 包,这样它就不会使用 dselect 并在包名称上按 = 自动升级。

我不完全确定 mongodb 做了什么,但我很确定它会在更新时自行重启。

docker-engine 的问题不在于它不会自行重启,它实际上会重启,您可以在更新后通过 运行 以下命令验证:

sudo service docker status

只是它不会重新启动 运行 容器。我不完全知道为什么它必须是这样的,因为如果服务重新启动,理论上它可以带回 运行 容器,但无论出于何种原因,它都没有这样做。

有两种方法可以解决此问题。

排除 docker-engine 更新并在您看到它可用时手动进行更新的第一种简单方法。

sudo apt-mark hold docker-engine
sudo apt-get upgrade

如果有更新以及更新是否被保留,您应该会看到通知

...
The following packages were kept back:
docker-engine
...

如果您有无法在升级时重新启动的容器,您应该走这条路。

但是,如果您有能力重新启动它们,则可以使用第二种方法。您可以在启动容器时设置重启策略,如下所示:

sudo docker run --restart=always -d image-name

这样,当docker-引擎重新启动时,容器也随之启动。这意味着在更新时,以这种方式启动的容器会自动启动。