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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:22:10