Kot*_*lar 6 docker docker-buildkit
有人声称,在拉取镜像后可以提取 Docker 镜像的构建参数(示例)。
我已经使用以下 Dockerfile 对此进行了测试:
FROM scratch
ARG SECRET
ADD Dockerfile .
Run Code Online (Sandbox Code Playgroud)
当我构建图像时:
$ docker build -t build-args-test --build-arg SECRET=12345 .
Run Code Online (Sandbox Code Playgroud)
并按照文章中指定的方式检查它:
$ docker image history --no-trunc build-args-test
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:(hash omitted) 17 minutes ago ADD Dockerfile . # buildkit 43B buildkit.dockerfile.v0
<missing> 17 minutes ago ARG SECRET 0B buildkit.dockerfile.v0
Run Code Online (Sandbox Code Playgroud)
我看不到实际的构建参数 ( 12345)。
有没有办法从图像中提取构建参数?
如果图像不是在我的机器上构建而是从存储库中提取的,答案会有所不同吗?
我知道Docker 构建秘密功能。但是,我具体询问的是ARG.
这取决于。
\n如果您使用该秘密,它将显示在使用该秘密的图像层中。由于 ADD 步骤没有使用 ARG,您没有看到它,但每个 RUN 步骤都会将 ARG 值作为环境变量注入,您会得到类似以下内容的内容:
\n$ cat df.secret-arg \nFROM alpine:latest\n\nARG SECRET\nRUN echo doing something with a secret\n\n$ DOCKER_BUILDKIT=0 docker build -t test-secret-arg --build-arg SECRET=password123 -f df.secret-arg .\nSending build context to Docker daemon 22.02kB\nStep 1/3 : FROM alpine:latest\n ---> 49f356fa4513\nStep 2/3 : ARG SECRET\n ---> Using cache\n ---> 7181367a28e6\nStep 3/3 : RUN echo doing something with a secret\n ---> Running in a46ee00e682a\ndoing something with a secret\nRemoving intermediate container a46ee00e682a\n ---> e3eeea5f5d6d\nSuccessfully built e3eeea5f5d6d\nSuccessfully tagged test-secret-arg:latest\n\n$ docker history test-secret-arg\nIMAGE CREATED CREATED BY SIZE COMMENT\ne3eeea5f5d6d 6 seconds ago |1 SECRET=password123 /bin/sh -c echo doing \xe2\x80\xa6 0B\n7181367a28e6 33 seconds ago /bin/sh -c #(nop) ARG SECRET 0B\n49f356fa4513 3 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B\n<missing> 3 months ago /bin/sh -c #(nop) ADD file:7119167b56ff1228b\xe2\x80\xa6 5.61MB\nRun Code Online (Sandbox Code Playgroud)\nSECRET=password123您可以使用 echo 命令在顶层看到。在“使用该秘密的图像层”条件下,我掩盖了很多内容,因为存在诸如多阶段构建之类的东西。但风险在于,如果你弄错了,秘密就会泄露。
将映像推送到注册表也无济于事:
\n$ docker tag test-secret-arg localhost:5000/test:secret-arg\n\n$ docker push localhost:5000/test:secret-arg\nThe push refers to repository [localhost:5000/test]\n8ea3b23f387b: Mounted from test/layer-bot\nsecret-arg: digest: sha256:969350bede26545fd35b53abed429ca0ecf2fc8717435a2edd842b4c9572b5bc size: 528\n\n$ regctl image config localhost:5000/test:secret-arg\n{\n "created": "2021-06-30T01:06:04.766667999Z",\n "architecture": "amd64",\n "os": "linux",\n "config": {\n "Env": [\n "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"\n ],\n "Cmd": [\n "/bin/sh"\n ]\n },\n "rootfs": {\n "type": "layers",\n "diff_ids": [\n "sha256:8ea3b23f387bedc5e3cee574742d748941443c328a75f511eb37b0d8b6164130"\n ]\n },\n "history": [\n {\n "created": "2021-03-31T20:10:06.686359124Z",\n "created_by": "/bin/sh -c #(nop) ADD file:7119167b56ff1228b2fb639c768955ce9db7a999cd947179240b216dfa5ccbb9 in / "\n },\n {\n "created": "2021-03-31T20:10:06.934368604Z",\n "created_by": "/bin/sh -c #(nop) CMD [\\"/bin/sh\\"]",\n "empty_layer": true\n },\n {\n "created": "2021-06-30T01:05:37.908964654Z",\n "created_by": "/bin/sh -c #(nop) ARG SECRET",\n "empty_layer": true\n },\n {\n "created": "2021-06-30T01:06:04.766667999Z",\n "created_by": "|1 SECRET=password123 /bin/sh -c echo doing something with a secret",\n "empty_layer": true\n }\n ]\n}\nRun Code Online (Sandbox Code Playgroud)\n(请注意,regctl 可从我的存储库中获取,但这只是进行注册表 API 调用。拉取映像并在另一台计算机上进行检查仍会显示构建参数。)
\n一般来说,不要在 docker 镜像构建中使用秘密,这是代码味道。通常,CI 系统应该检查包含秘密的代码,并且映像中应该包含二进制文件和库,而不是您想要保密的数据或配置。数据属于卷,配置以多种方式注入到容器中(配置文件挂载、秘密、环境变量等,但在容器中,而不是在映像中)。有关使用机密的更多方法,请参阅将AWS凭证传递到 Docker 容器的最佳方式是什么?。
\n| 归档时间: |
|
| 查看次数: |
4386 次 |
| 最近记录: |