背景:

基于 Docker-compose 部署 mongodb 时,配置了副本集与key文件认证:

  mongodb:
    image: mongo:latest
    container_name: mongodb
	..
    volumes:
      - /xx/mongodb_data:/data/db
      - /xx/mongodb.key:/data/mongodb.key		# key文件的持久化存储
    ..
    command: ["mongod", "--replSet", "rs0", "--auth", "--keyFile", "/data/mongodb.key"]	# 开启副本集与ke文件认证

现象:

无法启动该容器,查看日志则显示以下错误:

{"t":{"$date":"2025-08-11T06:04:38.531+00:00"},"s":"I",  "c":"ACCESS",   "id":20254,   "ctx":"main","msg":"Read security file failed","attr":{"error":{"code":30,"codeName":"InvalidPath","errmsg":"error opening file: /data/mongodb.key: bad file"}}}

原因:

MongoDB 对 keyFile 有严格的安全校验:文件必须仅对所有者可读(一般 400 或 600),且文件所有者必须与运行 mongod 的用户相同。而笔者的keyFile所有者如下所示:
在这里插入图片描述

在 mongo 容器里,mongodb 默认以 uid 999 运行。当把主机上的文件挂载进容器时,文件的所有者还是主机的 root。由于所有者不匹配,MongoDB 判定这个 keyfile 不安全,报 bad file/InvalidPath

解决:

chown 999 /xx/mongodb.key
然后再重新启动容器:

docker-compose down && docker-compose up -d mongodb

在这里插入图片描述
执行后,文件所有者变成了和容器内的 mongod 一致,加上 400 权限就通过了 MongoDB 的安全检查。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐