如何将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
相关产品推荐
相关产品推荐

