如何通过Dockerfile挂载Secret传递至容器?实践遇阻求助
问题分析与解决方案
核心问题
你混淆了Docker构建阶段Secret和运行阶段Secret的作用:
RUN --mount=type=secret仅在构建过程中临时挂载Secret,构建完成后该Secret不会被打包到最终镜像中,所以容器运行时根本不存在/run/secrets/THEPASSWORD1文件。- 你用docker-compose能成功,是因为docker-compose的
secrets配置是在容器运行时将Secret挂载到容器内,和构建阶段的Secret机制完全不同。
方案1:运行时挂载Secret(满足你的需求)
如果你的Node.js程序需要在容器运行时读取Secret,无需在Dockerfile中配置构建阶段Secret,直接在docker run时挂载Secret即可:
修改后的Dockerfile
FROM node:20 WORKDIR /usr/src/app COPY node-files . RUN npm ci && npm run build ENV NODE_ENV=production CMD ["node", "dist/get-secrets.js"]
运行容器的两种挂载方式
方式1:先将Secret加入Docker存储再挂载
# 本地Secret文件加入Docker Secret存储 docker secret create THEPASSWORD1 ./.secrets/THEPASSWORD1 docker secret create THEPASSWORD2 ./.secrets/THEPASSWORD2 # 运行容器时挂载Secret docker run --name distroless-node-dumbinit \ --mount type=secret,id=THEPASSWORD1,target=/run/secrets/THEPASSWORD1 \ --mount type=secret,id=THEPASSWORD2,target=/run/secrets/THEPASSWORD2 \ distroless-node-dumbinit:1
方式2:直接挂载本地Secret文件(无需提前加入存储)
docker run --name distroless-node-dumbinit \ --secret id=THEPASSWORD1,src=./.secrets/THEPASSWORD1,target=/run/secrets/THEPASSWORD1 \ --secret id=THEPASSWORD2,src=./.secrets/THEPASSWORD2,target=/run/secrets/THEPASSWORD2 \ distroless-node-dumbinit:1
方案2:构建阶段使用Secret(仅适配构建时需求)
如果你的需求是构建过程中需要用到Secret(比如安装私有npm依赖),RUN --mount=type=secret的正确用法是在RUN命令中临时读取Secret,用完即销毁:
FROM node:20 WORKDIR /usr/src/app COPY node-files . # 构建阶段挂载Secret,用于私有依赖安装,执行后删除敏感配置 RUN --mount=type=secret,id=THEPASSWORD1 \ echo "//registry.npmjs.org/:_authToken=$(cat /run/secrets/THEPASSWORD1)" > .npmrc \ && npm ci && npm run build \ && rm .npmrc ENV NODE_ENV=production CMD ["node", "dist/get-secrets.js"]
这种场景下Secret仅在构建期间可用,不会留在最终镜像中,不适合你需要运行时读取Secret的需求。
内容的提问来源于stack exchange,提问作者Inspiraller
相关产品推荐
相关产品推荐

