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

