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

Docker Compose中用环境变量配置构建Secret失败求解

问题根源与修正方案

你当前的Compose配置把构建阶段需要的Secret和容器运行时的Secret搞混了——顶层secrets和服务下的secrets节点是给容器运行时用的,而构建阶段的Secret需要单独在build块内配置。

核心修正点

  • 构建阶段的Secret必须定义在服务的build字段下,而非顶层secrets
  • Dockerfile中需要通过RUN --mount=type=secret指令挂载这些Secret,才能在构建过程中访问

修正后的Compose配置

<service>:
    container_name: <service-container>
    restart: unless-stopped
    env_file:
      - $LOCATION/.env
    volumes:
      - $LOCATION/directory:/app/
    build:
      context: $LOCATION/directory
      target: local_dev
      # 这里配置构建阶段要用的Secret
      secrets:
        - ARTIFACTORY_USER
        - ARTIFACTORY_PASS
    # 如果容器运行时不需要这两个Secret,可以删掉下面的secrets节点
    secrets:
      - ARTIFACTORY_USER
      - ARTIFACTORY_PASS
    networks:
      vpcbr:
        ipv4_address: 172.20.0.12
    ports:
      - 8000:8000

# 顶层secrets配置保留(如果运行时需要),构建阶段的Secret来源是主机环境变量,需在build块声明
secrets:
  ARTIFACTORY_USER:
    environment: ARTIFACTORY_USER
  ARTIFACTORY_PASS:
    environment: ARTIFACTORY_PASS

对应的Dockerfile关键写法

在需要使用Secret的构建步骤中,挂载并读取:

# 示例:用Secret登录Artifactory
RUN --mount=type=secret,id=ARTIFACTORY_USER \
    --mount=type=secret,id=ARTIFACTORY_PASS \
    echo "Logging in to Artifactory..." && \
    docker login your-artifactory-url -u $(cat /run/secrets/ARTIFACTORY_USER) -p $(cat /run/secrets/ARTIFACTORY_PASS)

额外注意事项

  • 执行docker compose build <service>前,确保当前shell环境已设置ARTIFACTORY_USER和ARTIFACTORY_PASS,也可通过ARTIFACTORY_USER=xxx ARTIFACTORY_PASS=yyy docker compose build <service>临时传递
  • 若Docker Compose版本较旧,可能不支持构建阶段的环境变量Secret,建议升级到v2.10+版本

内容的提问来源于stack exchange,提问作者cremedekhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:35:16