如何使用Docker的“git”功能?

UPDATED我特别感兴趣的是我如何运行或回滚到一个特定版本的(二进制)图像从docker,并试图澄清这个问题.

Docker FAQ说:

Docker includes git-like capabilities for tracking successive versions of a container,inspecting the diff between versions,committing new versions,rolling back etc. The history also includes how a container was assembled and by whom,so you get full traceability from the production server all the way back to the upstream developer.

Google可能没有找到没有“回滚”到早期的容器,检查差异等的示例(显然,我可以为版本管理的Dockerfiles做这些事情,但二进制Docker映像/容器即使在由于更新的软件来源,Dockerfile并没有,我正在寻找一种在这些更改之间查看和回滚的方法).

一个基本的例子:想象我跑

docker build -t myimage .

在更新基础ubuntu的Docker文件上:

FROM ubuntu:14:04
RUN apt-get update -q && apt-get upgrade -y

如果我在几天之后建立相同的图像,那么我怎么能区分这些图像来查看哪些软件包已被升级?稍后重新运行相同的构建命令后,如何回滚到早期版本的映像?

最佳答案
编辑:从技术上讲,我们只是回滚AUFS图层,而不是回滚历史.如果我们的工作流由交互式修改我们的容器并使用docker commit提交更改,那么这真的会回滚历史记录,因为它删除了我们在后续层中应用的任何包更新,从而使安装在较早层的版本.如果从Dockerfile重建图像,这是非常不同的.那么这里没有什么可以让我们回到之前的版本,我们只能从Dockerfile中删除步骤(图层).换句话说,我们只能将我们的码头承诺的历史回滚到一个图像.

看来,回滚到早期版本的码头图像的关键是简单地将docker标签指向较早的散列.

例如,考虑检查标准ubuntu的历史:最新图像:

docker history ubuntu:latest

显示

IMAGE               CREATED             CREATED BY                                      SIZE
ba5877dc9bec        3 weeks ago         /bin/sh -c #(nop) CMD [/bin/bash]               0 B
2318d26665ef        3 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.903 kB
ebc34468f71d        3 weeks ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          8 B
25f11f5fb0cb        3 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
9bad880da3d2        3 weeks ago         /bin/sh -c #(nop) ADD file:de2b0b2e36953c018c   192.5 MB
511136ea3c5a        14 months ago    

                                               0 B

想象一下,我们想回到哈夫25f所示的图像:

docker tag 25f ubuntu:latest
docker history ubuntu:latest

我们看到:

IMAGE               CREATED             CREATED BY                                      SIZE
25f11f5fb0cb        3 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
9bad880da3d2        3 weeks ago         /bin/sh -c #(nop) ADD file:de2b0b2e36953c018c   192.5 MB
511136ea3c5a        14 months ago                                                       0 B

当然,我们可能永远不想以这种方式回滚,因为它使ubuntu:最新的不是我们本地库中最新的ubuntu.请注意,我们可以使用我们想要的任何标签,例如

docker tag 25f ubuntu:notlatest

或者通过哈希简单地启动旧的图像:

docker run -it 25f /bin/bash

那么简单而又整洁请注意,我们可以将其与docker检查结合起来,以获得关于Docker FAQ引用的每个图像的元数据的更多细节.

还要注意,docker diff和docker提交与此进程无关,因为它们是指容器(例如运行图像),而不直接映射到图像.也就是说,如果我们以交互方式运行图像,然后添加或更改图像上的文件,我们可以使用docker diff< Container-id>看到更改(容器之间)并使用docker commit< Container id&gt ;.提交更改.

相关文章

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Li...
1、什么是docker?答:docker是开源的应用容器引擎;开发人员把他们的应用及依赖包打包发布到容器当中。...
1、什么是namespace? 答:名称空间,作用隔离容器 2、namespace隔离有那些? 答:ipc:共享内存、消息队...
1、Docker能在非Linux平台(Windows+MacOS)上运行吗? 答:可以 2 、如何将一台宿主机的docker环境...
环境要求: IP hostname 192.168.1.1 node1 项目规划: 容器网段:172.16.10.0/24 NGINX:172.16.10.10...
文档上传地址:https://files.cnblogs.com/files/lin-strive/07-docker%E8%B7%A8%E4%B8%BB%E6%9C%BA%E7...