MongoDB 的 Docker 入口点脚本未执行

问题描述 投票:0回答:1

这是我在 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
>

我希望我已经提供了足够的细节。我编辑了实际的用户名、密码和数据库名称。请协助我解决这个问题。我目前看到的唯一解决方案是使用根用户验证我的应用程序,但我不想这样做。

mongodb bash docker docker-compose
1个回答
0
投票

你在作曲家日志中有这样的内容:

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 脚本中切换数据库。

来源:https://hub.docker.com/_/mongo

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.