从技术上讲,我们只是回滚 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 常见问题解答所引用的每个图像的元数据结合起来获得更多详细信息。
另请注意,docker diff
anddocker commit
与此过程相当不相关,因为它们指的是容器(例如正在运行的图像),而不是直接指图像。也就是说,如果我们以交互方式运行图像,然后在图像上添加或更改文件,我们可以通过 using 看到更改(容器之间)并使用docker diff <Container-id>
.com 提交更改docker commit <Container id>
。