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

Docker挂载的Secret未出现在容器指定目录中的问题排查

问题分析与解决方案

核心原因

你使用的RUN --mount=type=secret是Docker BuildKit提供的构建阶段临时挂载机制:

  • 该挂载仅在当前RUN指令的执行周期内有效,构建完成后会被清理,不会被包含在最终生成的镜像中。
  • 所以你在构建时能通过ls看到文件,但运行容器时,镜像里根本没有这个文件。

不同场景的解决方案

场景1:仅在构建阶段需要使用Secret

如果你的需求只是在构建过程中读取Secret(比如安装私有依赖、配置构建环境),当前的用法是正确的,但要注意:

  • Secret仅在挂载它的RUN指令中可用,其他构建步骤无法访问。
  • 示例(构建时读取.env配置):
#syntax = docker/dockerfile:1.4
FROM nginx:stable

COPY index.html /usr/share/nginx/html

# 构建阶段临时挂载Secret并读取内容
RUN --mount=type=secret,id=_env,dst=/run/secrets/.env \
    cat /run/secrets/.env && \
    # 这里可以添加依赖安装、环境配置等需要用到Secret的操作
    echo "构建阶段完成"

场景2:需要在容器运行阶段使用Secret

如果要让容器运行时能访问Secret,需要使用Docker的运行时Secret机制,以下是两种常用方式:

方式1:使用Docker Compose(适合单机开发/部署)

编写docker-compose.yml:

version: '3.9'
services:
  colorapp:
    image: nginx:stable
    volumes:
      - ./index.html:/usr/share/nginx/html
    # 挂载Secret到容器指定路径
    secrets:
      - source: my_env
        target: /run/secrets/.env
secrets:
  # 从本地.env文件创建Secret
  my_env:
    file: .env

启动容器:

docker-compose up -d
方式2:使用Docker Swarm Secrets(适合集群环境)
  1. 创建Swarm Secret:
docker secret create my_env .env
  1. 部署服务并挂载Secret:
docker service create \
  --name colorapp \
  --secret source=my_env,target=/run/secrets/.env \
  --mount type=bind,source=$(pwd)/index.html,target=/usr/share/nginx/html \
  nginx:stable
临时开发方案(不推荐生产环境)

如果只是本地开发临时测试,可以直接挂载本地文件到容器(但会暴露Secret文件,生产环境禁止使用):

docker run -d \
  -p 8080:80 \
  -v $(pwd)/index.html:/usr/share/nginx/html \
  -v $(pwd)/.env:/run/secrets/.env \
  nginx:stable

内容的提问来源于stack exchange,提问作者Mayank Singh Rathore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:07:35