我对如何从docker运行或回滚到(二进制)映像的特定版本特别感兴趣,并尝试对此进行澄清。
该泊坞窗常见问题,它说:
Docker包含类似git的功能,用于跟踪容器的连续版本,检查版本之间的差异,提交新版本,回滚等。历史记录还包括容器的组装方式和组装者,因此您可以从生产服务器上获得完全可追溯性一直回到上游开发人员。
就像我可能使用的Google一样,我找不到“回滚”到较早的容器,检查差异等的示例。(显然,我可以对版本管理的Dockerfile进行此类操作,但是即使由于软件源已更新,因此Dockerfile不会,我正在寻找一种查看和回滚此类更改的方法。
举个基本的例子:想象我跑步
docker build -t myimage .
在仅更新基本ubuntu的Dockerfile上:
FROM ubuntu:14:04
RUN apt-get update -q && apt-get upgrade -y
如果几天后生成同一映像,如何区分这些映像以查看升级了哪些软件包?稍后重新运行相同的构建命令后,如何回滚到映像的早期版本?
从技术上讲,我们仅回滚AUFS层,而不必回滚历史记录。如果我们的工作流程包括交互地修改容器并使用提交更改docker commit
,则确实会回滚历史记录,因为它将删除我们在以后的层中应用的所有软件包更新,而将版本安装在较早的层中。如果我们从Dockerfile重建映像,这是非常不同的。然后,这里没有任何东西可以让我们回到我们以前构建的版本,我们只能从Dockerfile中删除步骤(层)。换句话说,我们只能将docker commit
s的历史回滚到图像。
回滚到较早版本的docker映像的关键似乎只是将docker标签指向较早的哈希值。
例如,考虑检查history
标准ubuntu:latest
图像的:
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
想象一下,我们想回到由hash表示的图像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:latest
实际上并不是本地图书馆中最新的Ubuntu。请注意,我们可以使用所需的任何标签,例如
docker tag 25f ubuntu:notlatest
或只是通过哈希启动旧图像:
docker run -it 25f /bin/bash
如此简单却又如此整洁。请注意,我们可以将其与结合在一起,docker inspect
以获取有关Docker FAQ所引用的每个映像的元数据的更多详细信息。
还要注意,docker diff
并且docker commit
与该过程无关,因为它们是指容器(例如运行的图像),而不是直接指图像。也就是说,如果我们以交互方式运行图像,然后在图像上添加或更改文件,则可以使用查看更改(在容器之间),docker diff <Container-id>
并使用提交更改docker commit <Container id>
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句