将docker-compose密钥传入Dockerfile失败,求排查原因
问题:Docker Compose构建阶段无法识别传入的密钥
我尝试通过Docker Compose将密钥传入Dockerfile,该特性在Compose v2.5.0及以上版本支持,但实际传入的密钥无法被识别。
测试环境文件结构
. ├── docker-compose.working.yml ├── docker-compose.yml ├── Dockerfile └── secret
各文件内容
secret文件
cool
docker-compose.yml(无法正常工作的配置)
services: notworking: build: . secrets: - mysecret secrets: mysecret: file: ./secret
Dockerfile
FROM busybox RUN --mount=type=secret,required=true,id=mysecret cat /run/secrets/mysecret
执行错误信息
执行docker-compose up时出现以下错误:
Sending build context to Docker daemon 369B STEP 1/6: FROM busybox Resolving %!q(<nil>) to docker.io (enforced by caller) Trying to pull docker.io/library/busybox:latest... Getting image source signatures Copying blob sha256:f5b7ce95afea5d39690afc4c206ee1bf3e3e956dcc8d1ccd05c6613a39c4e4f8 Copying config sha256:ff4a8eb070e12018233797e865841d877a7835c4c6d5cfc52e5481995da6b2f7 Writing manifest to image destination Storing signatures STEP 2/6: RUN --mount=type=secret,required=true,id=mysecret cat /run/secrets/mysecret 1 error occurred: * Status: building at STEP "RUN --mount=type=secret,required=true,id=mysecret cat /run/secrets/mysecret": resolving mountpoints for container "b84f93ec384894b22ab1fba365f2d8a206e686882a19f6a3781a129a14fcb969": secret required but no secret with id mysecret found , Code: 1
可正常工作的对比配置
我编写了另一个不使用本地Dockerfile的docker-compose.working.yml,执行后可以正常读取密钥:
docker-compose.working.yml
services: working: image: busybox command: cat /run/secrets/mysecret secrets: - mysecret secrets: mysecret: file: ./secret
执行docker-compose -f docker-compose.working.yml up的输出:
[+] Running 1/0 ⠿ Container webster-parser-working-1 Created 0.0s Attaching to webster-parser-working-1 webster-parser-working-1 | cool webster-parser-working-1 exited with code 0
环境信息
$ docker version Docker version 20.10.19, build d85ef84533 $ docker-compose --version Docker Compose version 2.12.0
我底层使用Podman,但认为这不是问题根源,请问为什么构建时的密钥配置不生效?
解决方案
问题核心是Docker Compose的构建阶段与容器运行阶段,密钥传递的配置位置完全不同。你当前的secrets配置是给容器运行阶段用的,构建阶段需要单独在build节点下配置密钥,才能让Dockerfile里的--mount=type=secret读取到。
修改后的docker-compose.yml如下:
services: notworking: build: context: . secrets: - mysecret secrets: - mysecret secrets: mysecret: file: ./secret
关键说明
- 容器运行阶段的
secrets配置:作用是让容器启动后能访问密钥,对应你那个working服务的场景。 - 构建阶段的
secrets配置:必须嵌套在build节点下,这样Compose才会在构建镜像时把密钥传递给构建上下文,让Dockerfile里的RUN --mount指令能读取到/run/secrets/mysecret。
另外需要明确:构建阶段的密钥只是临时挂载使用,不会被打包进最终镜像,不存在密钥泄露风险。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

