假设我们刚刚启动了一个 docker 容器,并允许用户 SSH 通过映射端口 22:22
进入容器。
然后用户安装了一些软件,如 git 或任何他们想要的软件。所以那个容器现在被污染。
稍后,假设我想对容器应用一些补丁,最好的方法是什么?
请记住,用户已经修改了容器中的内容,包括一些系统级目录,如/usr/bin
。所以我不能简单地用另一个图像替换正在运行的容器。
所以给你一些现实生活中的用例。取Nitrous.io举个例子。我看到他们正在使用 docker 容器作为用户的虚拟机。因此用户可以安装像 Node.js 全局包这样的包。那么他们如何像专家一样更新/应用补丁到容器呢?类似的平台如 Codeanywhere可能以相同的方式工作。
我尝试用谷歌搜索,但失败了。不过,我不能 100% 确定这是否重复。
最佳答案
User then installed some software like git or whatever they want ... I want to apply some patch to the container, what is the best way to do so ?
推荐的方法是通过 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
希望这对您有所帮助!
关于docker - 将补丁应用于修改后的 docker 容器的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32961150/