将修补程序应用于修改过的docker容器的最佳做法?

时间:2015-10-06 03:17:03

标签: docker operation

所以我们假设我们只是通过映射端口22:22来启动一个docker容器并允许用户SSH进入容器。

然后用户安装了一些像git或他们想要的软件。因此容器现在污染

稍后,假设我想将一些补丁应用到容器中,最好的方法是什么?

请记住,用户已修改容器中的内容,包括某些系统级目录,如/usr/bin。所以我不能简单地用另一个图像替换正在运行的容器。

所以给你一些真实的用例。以Nitrous.io为例。我看到他们正在使用docker容器作为用户的VM。因此用户可以安装Node.js全局包等软件包。那么他们如何像专业人士一样更新/应用补丁?像Codeanywhere这样的类似平台也可能以同样的方式运作。

我试过google但是我失败了。我不是百分之百确定这是否重复。

2 个答案:

答案 0 :(得分:3)

  然后用户安装了一些像git或者他们想要的软件......我想在容器上应用一些补丁,最好的方法是什么?

推荐的方法是通过Dockerfile计划更新。但是,如果您无法实现这一点,则应在退出之前提交任何其他更改或安装到容器的新软件包。

例如:下面是创建的没有安装vim的简单容器。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
pingimg             1.5                 1e29ac7353d1        4 minutes ago       209.6 MB

启动容器并检查是否安装了vim

 $ docker run -it pingimg:1.5 /bin/bash
 root@f63accdae2ab:/#
 root@f63accdae2ab:/# vim
 bash: vim: command not found

在容器内安装所需的包:

 root@f63accdae2ab:/# sudo apt-get update && install -y vim

回到主机上,在停止或退出容器之前,使用新标签提交容器。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
f63accdae2ab        pingimg:1.5         "/bin/bash"         About a minute ago   Up About a minute                       modest_lovelace 

$ docker commit f63accdae2ab pingimg:1.6
378e0359eedfe902640ff71df4395c3fe9590254c8c667ea3efb54e033f24cbe

$ docker stop f63accdae2ab 
f63accdae2ab

现在,docker镜像应显示给容器的标签或版本。请注意,更新的容器显示更大的尺寸。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
pingimg             1.6                 378e0359eedf        43 seconds ago      252.8 MB  
pingimg             1.5                 1e29ac7353d1        4 minutes ago       209.6 MB

重新启动最近提交的容器,您可以看到vim已安装

$ docker run -it pingimg:1.6 /bin/bash
root@63dbbb8a9355:/# which vim
/usr/bin/vim

验证以前版本容器的内容,并注意到vim仍然缺失。

$ docker run -it pingimg:1.5 /bin/bash
root@99955058ea0b:/# which vim
root@99955058ea0b:/# vim
bash: vim: command not found

希望这有帮助!

答案 1 :(得分:2)

有一个名为configuration management的整个软件分支,旨在通过AnsiblePuppet等解决方案解决此问题。虽然在设计时考虑了VM,但当然可以将这些解决方案与容器一起使用。

然而,这不是Docker方式。而不是修补Docker容器,扔掉它并用新的容器替换它。如果您需要安装新软件,请将其添加到Dockerfile并根据@ askb的解决方案构建一个新容器。通过这种方式,我们可以避免一系列令人头痛的问题(类似地,更喜欢docker exec在容器中安装ssh。)