这是我在 MongoDB 论坛上提出的问题的副本,可在此处访问。自从我发帖以来已经过去了大约 12 个小时,所以我现在正在尝试看看是否能够得到 SO 的答案。我还添加了一些额外的细节。
我一整天都在努力让 MongoDB 的 Docker 设置正常工作。不幸的是,我没能做到。 我有一个 docker-compose.yml 文件,其中有我的应用程序和 MongoDB:
services:
app:
build: ./app
restart: unless-stopped
env_file: "app/.env"
ports:
- 21865:21865
depends_on:
mongo:
condition: service_healthy
networks:
- mongo-network
mongo:
image: mongo:latest
restart: unless-stopped
ports:
- 27017:27017
env_file: "mongo/.env"
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 10s
retries: 5
volumes:
- ./mongo/data:/data/db
- ./mongo/scripts:/docker-entrypoint-initdb.d/
networks:
- mongo-network
networks:
mongo-network:
driver: bridge
我的入口点脚本是 mongo/scripts/init.js:
use db1;
db.col1.insertOne({"exists": true});
db.createUser({
user: "<user>",
pwd: "<pw>",
roles: [ { role: "readWrite", db: "db1" } ]
});
use db2;
db.col2.insertOne({"exists": true});
db.createUser({
user: "<user>",
pwd: "<pw>",
roles: [ { role: "readWrite", db: "db2" } ]
});
我正在使用一些可能冗余的代码来确保数据库 db1 和 db2 的存在。但是,当我启动 Docker Compose 并使用 root 进行身份验证 (
docker-compose exec -it mongo mongosh -u "root" -p
) 并运行 show databases
时,数据库 db1 和 db22 不会显示:
test> show databases;
admin 100.00 KiB
config 12.00 KiB
local 72.00 KiB
此外,无论是否指定 authSource,身份验证总是会失败。这是我的应用程序尝试进行身份验证后的输出。
docker-compose logs mongo | grep <user>
docker-server-mongo-1 | {"t":{"$date":"2024-10-20T17:31:28.573+00:00"},"s":"I", "c":"ACCESS", "id":20251, "ctx":"conn300","msg":"Supported SASL mechanisms requested for unknown user","attr":{"user":{"user":"<user>","db":"<db1>"}}}
docker-server-mongo-1 | {"t":{"$date":"2024-10-20T17:31:28.573+00:00"},"s":"I", "c":"ACCESS", "id":5286307, "ctx":"conn300","msg":"Failed to authenticate","attr":{"client":"192.168.160.3:44922","isSpeculative":true,"isClusterMember":false,"mechanism":"SCRAM-SHA-256","user":"<user>","db":"<db1>","error":"UserNotFound: Could not find user \"<user1>\" for db \"<db1>\"","result":11,"metrics":{"conversation_duration":{"micros":177,"summary":{"0":{"step":1,"step_total":2,"duration_micros":150}}}},"extraInfo":{}}}
docker-server-mongo-1 | {"t":{"$date":"2024-10-20T17:31:28.575+00:00"},"s":"I", "c":"ACCESS", "id":5286307, "ctx":"conn300","msg":"Failed to authenticate","attr":{"client":"192.168.160.3:44922","isSpeculative":false,"isClusterMember":false,"mechanism":"SCRAM-SHA-1","user":"<user>","db":"<db1>","error":"UserNotFound: Could not find user \"<user>\" for db \"<db1>\"","result":11,"metrics":{"conversation_duration":{"micros":194,"summary":{"0":{"step":1,"step_total":2,"duration_micros":181}}}},"extraInfo":{}}}
我能够通过运行curl来确认MongoDB服务器可以在本地访问:
> curl localhost:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.
猛击我的应用程序,curl 还显示数据库可以访问:
> docker-compose exec -it app bash
bash-5.2# curl mongo:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.
有趣的是,我能够确认 MongoDB 承认该脚本的存在。所以我尝试在启动脚本中包含一个
printjson({"This": "Works"})
语句,但没有成功。
> docker-compose logs mongo | grep entrypoint
docker-server-mongo-1 | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.js
> docker-compose logs mongo | grep This
>
我希望我已经提供了足够的细节。我编辑了实际的用户名、密码和数据库名称。请协助我解决这个问题。我目前看到的唯一解决方案是使用根用户验证我的应用程序,但我不想这样做。
你在作曲家日志中有这样的内容:
mongo-1 | SyntaxError: Missing semicolon. (1:3)
mongo-1 |
mongo-1 | > 1 | use db1;
mongo-1 | | ^
脚本语法与交互式 shell 风格略有不同:
db = connect('mongodb://localhost/db1'); db.col1.insertOne({"exists": true});
旁注:
启动composer时确保
./mongo/data
为空。
当数据库尚未初始化时,Initdb 脚本仅运行一次:
初始化一个新实例
当第一次启动容器时,它将执行在 /docker-entrypoint-initdb.d 中找到的扩展名为 .sh 和 .js 的文件。文件将按字母顺序执行。 .js 文件将由 mongosh(版本低于 6 的 mongo)使用 MONGO_INITDB_DATABASE 变量指定的数据库(如果存在)执行,否则进行测试。您还可以在 .js 脚本中切换数据库。