假设我已经取出了mysql:5.6.21的官方映像。

我通过创建几个docker容器部署了这个映像。

这些容器已经运行了一段时间,直到MySQL 5.6.22发布。mysql:5.6的官方形象随着新版本的发布而更新,但我的容器仍然运行5.6.21。

我如何传播映像中的更改(即升级MySQL发行版)到所有现有的容器?Docker的正确方式是什么?


当前回答

与上述答案相似

docker images | awk '{print $1}' | grep -v 'none' | grep -iv 'repo' | xargs -n1 docker pull

其他回答

我想补充的是,如果你想自动完成这个过程(下载、停止和重新启动一个新容器,设置与@Yaroslav所描述的相同),你可以使用WatchTower。一个程序,自动更新你的容器时,他们被改变https://github.com/v2tec/watchtower

更新

这主要是查询容器不更新作为构建图像是要做的方法

我也遇到了同样的问题,所以我创建了docker-run,这是一个非常简单的命令行工具,在docker容器中运行,以更新其他运行容器中的包。

它使用docker-py与正在运行的docker容器通信,更新包或运行任意单个命令

例子:

Docker run——rm -v /var/run/ Docker .sock:/tmp/ Docker .sockSock itech/docker-run exec

默认情况下,这将在所有正在运行的容器中运行date命令并返回结果,但您可以发出任何命令,例如docker-run exec "uname -a"

更新包(目前只使用apt-get):

Docker run——rm -v /var/run/ Docker .sock:/tmp/ Docker .sockSock itech/docker-run更新

您可以创建和别名,并将其作为常规命令行使用 如。

别名docker-run='docker run——rm -v /var/run/docker.sock:/tmp/docker. sock:/tmp/docker. sock袜子itech / docker-run '

确保您将所有持久数据(配置、日志或应用程序数据)都用于卷,这些数据存储在与容器内进程状态相关的容器上。更新Dockerfile并使用您想要的更改重新构建映像,并重新启动容器,将卷挂载到相应的位置。

摘自http://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/

您可以使用以下命令管道更新所有现有的映像:

docker images | awk '/^REPOSITORY|\<none\>/ {next} {print $1}' | xargs -n 1 docker pull

与上述答案相似

docker images | awk '{print $1}' | grep -v 'none' | grep -iv 'repo' | xargs -n1 docker pull