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

使用GitHub Actions的docker build/push Action无法挂载Secret到Dockerfile

Docker构建中Secret无法访问的问题原因

问题场景

尝试通过GitHub Actions的docker/build-push-action传递密钥到Docker构建流程,构建时报错:

cat: /run/secrets/MY_PASSWORD: No such file or directory

用到的Action配置

- name: build and push base runtime image
  uses: docker/build-push-action@v5
  with:
    file: path/to/Dockerfile 
    build-args: |
      USERNAME=${{ inputs.username }}
    secrets: |
      ${{ secrets.MY_PASSWORD }}

对应的Dockerfile内容

FROM ubuntu:latest

ARG USERNAME

COPY ./test-script.sh .

RUN --mount=type=secret,id=MY_PASSWORD \
  cat /run/secrets/MY_PASSWORD

RUN ./test-script.sh ${USERNAME} $(cat /run/secrets/MY_PASSWORD)

错误原因分析

1. GitHub Action的Secrets配置格式错误

docker/build-push-action传递Secrets时,必须明确指定Secret的ID(需与Dockerfile中mount指定的ID对应)。仅写${{ secrets.MY_PASSWORD }}无法让Action识别该密钥的标识,导致构建时未将密钥挂载到容器中。

正确的Secrets配置格式应为:

secrets: |
  MY_PASSWORD=${{ secrets.MY_PASSWORD }}
# 或更明确的格式
secrets: |
  id=MY_PASSWORD,src=${{ secrets.MY_PASSWORD }}

2. Secret挂载仅对单个RUN命令生效

Docker的--mount=type=secret是临时挂载,仅在它所在的那一条RUN命令执行期间有效。第二个RUN命令未挂载Secret,因此无法访问/run/secrets/MY_PASSWORD。

若要在多个步骤中使用该Secret,可采用两种解决方案:

  • 将需使用Secret的命令合并到同一个RUN中:
    RUN --mount=type=secret,id=MY_PASSWORD \
        cat /run/secrets/MY_PASSWORD && \
        ./test-script.sh ${USERNAME} $(cat /run/secrets/MY_PASSWORD)
    
  • 将Secret内容写入容器临时文件(注意构建完成后清理,避免泄露),后续步骤读取该文件:
    RUN --mount=type=secret,id=MY_PASSWORD \
        cat /run/secrets/MY_PASSWORD > /tmp/my_password && \
        chmod 600 /tmp/my_password
    
    RUN ./test-script.sh ${USERNAME} $(cat /tmp/my_password) && \
        rm /tmp/my_password
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:00:03