docker - 将补丁应用于修改后的 docker 容器的最佳实践?

标签 docker operation

假设我们刚刚启动了一个 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/

相关文章:

docker 登录到 nexus 连接被拒绝

docker - 如何使用 docker-compose 跳过执行单个服务?

node.js - Github 私有(private)包未安装在 docker build 中

visual-studio - Docker 在 Visual Studio 2017 中失败,如何让 docker 在 VS2017 中运行

java - 对空结果集的非法操作

python - subprocess.Popen 成功消息

java - 加或减 double 会给出错误的结果

linux - Dockerfile 中的 setfacl 没有效果

javascript - 猜数字 – 创建数字范围 JavaScript

python-2.7 - IOError: [Errno 1] 不允许操作