我特别感兴趣的是如何从docker运行或回滚到特定版本的(二进制)图像,并试图澄清这个问题.
该泊坞窗常见问题,它说:
Docker包括类似git的功能,用于跟踪容器的后续版本,检查版本之间的差异,提交新版本,回滚等.历史记录还包括容器的组装方式和由谁组成,因此您可以从生产服务器获得完全可跟踪性一直回到上游开发者.
谷歌,我可以,我找不到"回滚"到早期容器,检查差异等的例子(显然我可以为版本管理的Dockerfiles做这样的事情,但二进制Docker图像/容器即使在由于更新的软件源,Dockerfile没有,我正在寻找一种方法来查看和回滚这些更改).
一个基本的例子:想象我跑
docker build -t myimage .
Run Code Online (Sandbox Code Playgroud)
在只更新基本ubuntu的Dockerfile上:
FROM ubuntu:14:04
RUN apt-get update -q && apt-get upgrade -y
Run Code Online (Sandbox Code Playgroud)
如果我在几天后构建相同的图像,我如何区分这些图像以查看哪些包已升级?在以后重新运行相同的构建命令后,如何回滚到映像的早期版本?
cbo*_*tig 12
从技术上讲,我们只是回滚AUFS层,不一定回滚历史.如果我们的工作流程包括以交互方式修改我们的容器并提交更改docker commit,那么这确实会回滚历史记录,因为它会删除我们在以后的层中应用的任何包更新,而不会在早期层中安装版本.如果我们从Dockerfile重建图像,这是非常不同的.那么这里没有任何东西让我们回到我们构建的先前版本,我们只能从Dockerfile中删除步骤(图层).换句话说,我们只能将docker commits 的历史回滚到图像中.
回滚到早期版本的docker镜像似乎只是将docker标记指向较早的哈希值.
例如,考虑检查history标准ubuntu:latest图像:
docker history ubuntu:latest
Run Code Online (Sandbox Code Playgroud)
显示:
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
Run Code Online (Sandbox Code Playgroud)
想象一下,我们想回到hash指示的图像25f:
docker tag 25f ubuntu:latest
docker history ubuntu:latest
Run Code Online (Sandbox Code Playgroud)
我们看到:
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
Run Code Online (Sandbox Code Playgroud)
当然,我们可能永远不想以这种方式回滚,因为它ubuntu:latest实际上并不是我们本地库中最新的ubuntu.请注意,我们可以使用任何我们想要的标签,例如
docker tag 25f ubuntu:notlatest
Run Code Online (Sandbox Code Playgroud)
或者只是通过哈希启动旧图像:
docker run -it 25f /bin/bash
Run Code Online (Sandbox Code Playgroud)
如此简单而又如此整洁.请注意,我们可以将此结合起来,docker inspect以获得有关Docker FAQ所引用的每个图像的元数据的更多详细信息.
还要注意docker diff并且docker commit与此过程无关,因为它们指的是容器(例如运行图像),而不是直接指向图像.也就是说,如果我们以交互方式运行图像然后在图像上添加或更改文件,我们可以通过使用docker diff <Container-id>和提交更改来查看更改(在容器之间)docker commit <Container id>.
| 归档时间: |
|
| 查看次数: |
3516 次 |
| 最近记录: |