将修补程序应用于修改的泊坞窗容器的最佳实践?

假设我们将一个docker容器放在一个容器中,并允许用户通过映射端口22:22将SSH放入容器中。

用户然后安装一些像git或任何他们想要的软件。 所以那个容器现在被污染了

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

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

所以给你一些真实的生活用例。 以Nitrous.io为例。 我看到他们正在使用docker容器作为用户的虚拟机。 所以用户可以安装像Node.js全局包这样的包。 那么他们如何更新/应用补丁像专业的容器? 像Codeanywhere这样的类似平台也可能以相同的方式工作。

我试过谷歌,但我失败了。 我不是100%确定这是否是重复的。

然后用户安装了一些软件,如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 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 

validation以前版本容器的内容,并且应该注意到vim仍然丢失。

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

希望这可以帮助!

有一整套称为configurationpipe理的软件,试图解决这个问题, Ansible和Puppet等解决scheme。 虽然devise时考虑到了虚拟机,但将这些解决scheme与容器一起使用肯定是可行的。

但是,这不是Docker的方式。 而不是修补一个Docker容器,把它扔掉,并用一个新的replace它。 如果您需要安装新软件,请将其添加到Dockerfile中,并根据@ askb的解决scheme构build一个新的容器。 通过这样做,我们可以避免一整套头痛(同样,喜欢docker exec来在容器中安装ssh)。