docker 镜像的扁平化

Dockerfile 的设计以及它们产出 Docker 镜像的结果便是,最终镜像里包含了 Dockerfile 里每一步的数据状态。在构建镜像的过程中,可能需要复制私密信息来确保构建工作可以顺利进行。这些所谓的私密信息可能是 ssH 密钥、证书或者密码文件等。在提交镜像前删除这些私密信息的话可能不会提供任何实质性的保护,因为它们将出现在最终镜像的更高分层里,而恶意用户则可以轻松地从镜像中提取它们。解决这一问题的其中一个办法便是将得到的镜像扁平化。

问题
想要从镜像的分层历史中移除私密信息。

解决方案
基于该镜像创建一个容器,将它导出再导人,然后给它打上最初镜像田的标签。

讨论
为了演示这种做法的可用场景,让我们在一个新目录里创建一个简单的 Dockerfile ,该目录下藏着一个大秘密。运行 mkdir secrets “ cd Secrets ,然后在该目录里创建一个包含如下内容的 Dockerfile :

1
2
3
4
FROM busybox
RUN echo "My Big secret" >> /tmp/secret_key
RUN cat /tmp/secret_key
RUn rm /tmp/secret_key

运行 docker build -t mysecret .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
➜   docker build -t mysecret .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM busybox
---> 8c811b4aec35
Step 2/4 : RUN echo "My Big secret" >> /tmp/secret_key
---> Running in 2b6f94ac0148
Removing intermediate container 2b6f94ac0148
---> a9ecbe44119c
Step 3/4 : RUN cat /tmp/secret_key
---> Running in b515370b1b88
My Big secret
Removing intermediate container b515370b1b88
---> 8a890a1ace7c
Step 4/4 : RUn rm /tmp/secret_key
---> Running in c9910e46efc2
Removing intermediate container c9910e46efc2
---> 6010dbf70359
Successfully built 6010dbf70359
Successfully tagged mysecret:latest

可以使用docker history 命令检查得到的Docker镜像的分层.如果该镜像上传到公有仓库,被他人下载,在没有原始 Dockerfile 到情况下,可以轻松获取私密信息。

1
2
3
4
5
6
7
➜   docker history mysecret:latest
IMAGE CREATED CREATED BY SIZE COMMENT
6010dbf70359 22 seconds ago /bin/sh -c rm /tmp/secret_key 0B
8a890a1ace7c 23 seconds ago /bin/sh -c cat /tmp/secret_key 0B
a9ecbe44119c 25 seconds ago /bin/sh -c echo "My Big secret" >> /tmp/secr… 14B
8c811b4aec35 14 months ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 14 months ago /bin/sh -c #(nop) ADD file:5f0439d8328ab58c0… 1.15MB

解决方法

将该镜像导出为一个简单运行的容器,然后再重新导入并给得到的镜像打上标签

1
2
3
4
5
6
7
➜   docker run -d mysecret /bin/true
02cbd0f59623472acc4571c1b654cdca40730d036d7a96a7dbaacaaf264177aa
➜ docker export 02cbd0f5962 | docker import - mysecret
sha256:080b122e43cb5d46efec5aa0b6abd0570e1abc52b3293f77b091bf22722c1168
➜ docker history mysecret
IMAGE CREATED CREATED BY SIZE COMMENT
080b122e43cb 9 seconds ago 1.15MB Imported from -
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2019-2024 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~