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
相关产品推荐
相关产品推荐

