You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:55:21