可以从中提取用于 Docker 映像的构建参数吗?

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.

BMi*_*tch 5

这取决于。

\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\n
Run Code Online (Sandbox Code Playgroud)\n

SECRET=password123您可以使用 echo 命令在顶层看到。在“使用该秘密的图像层”条件下,我掩盖了很多内容,因为存在诸如多阶段构建之类的东西。但风险在于,如果你弄错了,秘密就会泄露。

\n

将映像推送到注册表也无济于事:

\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}\n
Run Code Online (Sandbox Code Playgroud)\n

(请注意,regctl 可从我的存储库中获取,但这只是进行注册表 API 调用。拉取映像并在另一台计算机上进行检查仍会显示构建参数。)

\n

一般来说,不要在 docker 镜像构建中使用秘密,这是代码味道。通常,CI 系统应该检查包含秘密的代码,并且映像中应该包含二进制文件和库,而不是您想要保密的数据或配置。数据属于卷,配置以多种方式注入到容器中(配置文件挂载、秘密、环境变量等,但在容器中,而不是在映像中)。有关使用机密的更多方法,请参阅AWS凭证传递到 Docker 容器的最佳方式是什么?

\n

  • Buildkit 秘密应该是安全的。风险不是秘密本身被图像元数据泄露,而是使用秘密将受保护的数据从受保护的位置移动到图像中(人们经常意外地记录秘密)。 (2认同)