从技术上讲,我们只是回滚 AUFS 层,不一定回滚历史。如果我们的工作流程包括以交互方式修改我们的容器并使用docker commit 提交更改,那么这确实会回滚历史,因为它会删除我们在后续层中应用的任何包更新,而将版本安装在较早的层中。如果我们从 Dockerfile 重建镜像,情况就大不相同了。那么这里没有什么能让我们回到我们构建的以前的版本,我们只能从 Dockerfile 中删除步骤(层)。换句话说,我们只能将docker commits 的历史记录回滚到一张图片中。
似乎回滚到早期版本的 docker 映像的关键是将 docker 标记指向早期的哈希值。
例如,考虑检查标准ubuntu:latest 图像的history:
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:latest 实际上不是我们本地库中最新的 ubuntu。请注意,我们可以使用任何我们想要的标签,例如
docker tag 25f ubuntu:notlatest
或者简单地通过哈希启动旧图像:
docker run -it 25f /bin/bash
如此简单又如此整洁。请注意,我们可以将其与 docker inspect 结合使用,以获得有关 Docker 常见问题解答所引用的每个映像的元数据的更多详细信息。
还请注意,docker diff 和 docker commit 与此过程相当不相关,因为它们指的是容器(例如正在运行的图像),而不是直接指图像。也就是说,如果我们以交互方式运行图像,然后在图像上添加或更改文件,我们可以使用docker diff <Container-id> 看到更改(容器之间)并使用docker commit <Container id> 提交更改。