加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 03:31:42 所属栏目:安全 来源:网络整理
导读:UPDATED我特别感兴趣的是我如何运行或回滚到一个特定版本的(二进制)图像从docker,并试图澄清这个问题. Docker FAQ说: Docker includes git-like capabilities for tracking successive versions of a container,inspecting the diff between versions,commi

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 ;.提交更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读