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

如何将MongoDB种子JSON文件转为Docker Secret?遇报错求助

问题描述

我有一个用于MongoDB数据库初始化的JSON文件:

[
  {
    "name": "New User",
    "email": "newuser@test.com",
    "password": "HelloWorld_1337"
  }
]

原本在名为mongo-seed的容器的Dockerfile中通过COPY指令引入该文件:

FROM mongo

COPY first_user.json /first_user.json
COPY seed_db.sh /seed_db.sh

CMD ["bash", "/seed_data.sh"]

为了避免终端用户看到JSON文件内容,我尝试将其转为Docker Secret,执行了命令:

docker secret create first_user ./path/to/first_user.json

但通过docker-compose.yml运行项目时出现错误:

failed to solve: failed to compute cache key: failed to calculate checksum of ref [key]::[value]: "/run/secrets/first_user": not found

请问有没有可行的方法实现将该JSON文件转为Docker Secret?

解决方案

1. 调整Dockerfile,移除对JSON文件的COPY操作

Docker Secret是在容器运行阶段挂载到容器内的/run/secrets/目录下,镜像构建阶段无法访问这个路径,因此必须删除原来的COPY first_user.json /first_user.json指令,修改后的Dockerfile:

FROM mongo

COPY seed_db.sh /seed_db.sh

CMD ["bash", "/seed_data.sh"]

2. 修改seed_db.sh脚本,读取Secret文件内容

将脚本中读取/first_user.json的逻辑改为读取Secret路径/run/secrets/first_user,比如原本的mongoimport命令:

# 原命令
mongoimport --file /first_user.json <其他参数>

# 修改后
mongoimport --file /run/secrets/first_user <其他参数>

3. 在docker-compose.yml中配置Secret挂载

在docker-compose.yml中添加secrets配置,将已创建的first_user Secret挂载到mongo-seed容器:

version: '3.8'

services:
  mongo-seed:
    build: ./path/to/mongo-seed
    secrets:
      - first_user
    # 补充其他必要配置(如依赖MongoDB服务、网络配置等)

secrets:
  first_user:
    external: true # 指定使用已通过docker secret create创建的Secret

4. 确保在Swarm模式下运行服务

Docker Secret仅在Docker Swarm集群环境中生效,先初始化Swarm(单机也可启用):

docker swarm init

再通过stack部署服务:

docker stack deploy -c docker-compose.yml <自定义栈名称>

非Swarm环境替代方案

如果不想启用Swarm,可通过权限控制+绑定挂载实现类似效果:

  • 将JSON文件设置为仅当前用户可读:chmod 600 first_user.json
  • 在docker-compose.yml中通过绑定挂载将文件映射到容器内的/run/secrets/first_user路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:42:37