如何为init-mongo.sh:ro编写bash脚本以添加admin用户并运行初始化脚本



添加docker-entrypoint-initdb.d/init-mongo.sh:ro文件时,mongo的docker组合身份验证失败

docker-compose

version: "3.1"
services:
mongo1:
container_name: mongo1
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASS}
MONGO_INITDB_DATABASE: ${MONGO_DB_NAME}
ports:
- 27017:27017
- 28017:28017
env_file:
- .env
volumes:
- volume-mongo:/data/db
- ./mongo/init-mongo-js.sh:/docker-entrypoint-initdb.d/init-mongo.sh:ro
command: ['--auth', '--wiredTigerCacheSizeGB=1']
networks:
- mongo-network
# mongo-express:
#   container_name: mongo-express
#   image: mongo-express
#   restart: always
#   ports:
#     - '8081:8081'
#   env_file:
#     - .env
#   environment:
#     - ME_CONFIG_OPTIONS_EDITORTHEME=ambiance
#     - ME_CONFIG_BASICAUTH_USERNAME=${MONGO_USER}
#     - ME_CONFIG_BASICAUTH_PASSWORD=${MONGO_PASS}
#     - ME_CONFIG_MONGODB_ENABLE_ADMIN=true
#     - ME_CONFIG_MONGODB_AUTH_DATABASE=admin
#     - ME_CONFIG_MONGODB_SERVER=mongo1
#     - ME_CONFIG_MONGODB_ADMINUSERNAME=${MONGO_USER}
#     - ME_CONFIG_MONGODB_ADMINPASSWORD=${MONGO_PASS}
#   depends_on:
#     - mongo1
#   networks:
#     - mongo-network
volumes:
volume-mongo:
driver: local
networks:
mongo-network:
driver: bridge

.env

MONGO_DB_NAME=DBX
MONGO_USER=MYNEWUSERNAME
MONGO_PASS=somesecret
# Mongo host

尝试登录失败

docker exec -it mongo1 mongo admin -u MYNEWUSERNAME -p somesecret

当我删除对init-mongo.sh:ro-文件的引用时,它可以工作,但我不能运行我的初始化脚本。

我已经提到了这篇文章:https://github.com/docker-library/mongo/issues/174

我假设它失败的原因是因为我的bash文件- init-mon .sh:ro覆盖了这个文件:


if [ "$MONGO_INITDB_ROOT_USERNAME" ] && [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then 
rootAuthDatabase='admin' 
"${mongo[@]}" "$rootAuthDatabase" <<-EOJS 
db.createUser({ 
user: $(_js_escape "$MONGO_INITDB_ROOT_USERNAME"), 
pwd: $(_js_escape "$MONGO_INITDB_ROOT_PASSWORD"), 
roles: [ { role: 'root', db: $(_js_escape "$rootAuthDatabase") } ] 
}) 
EOJS 
fi 

如果这个理论是正确的,那么包括它到我的脚本与我的额外变化似乎是一个很好的解决方案。唯一的问题是在我的vscode中,使用shell格式扩展,这个代码组合的颜色编码看起来不正确,所以我怀疑它错了。

init-mongo.sh: ro试图组合以下内容:

#!/bin/bash
set -e
# set -e causes the whole script to exit when a command fails, so the script can't silently fail and startup mongo.
if [ "$MONGO_INITDB_ROOT_USERNAME" ] && [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then 
rootAuthDatabase='admin' 
"${mongo[@]}" "$rootAuthDatabase" <<-EOJS 
db.createUser({ 
user: $(_js_escape "$MONGO_INITDB_ROOT_USERNAME"), 
pwd: $(_js_escape "$MONGO_INITDB_ROOT_PASSWORD"), 
roles: [ { role: 'root', db: $(_js_escape "$rootAuthDatabase") } ] 
}) 
EOJS 
fi 
mongo <<EOF
use ${MONGO_DB_NAME}
db.createCollection("users")
db.users.insert({"name": "mike"})
EOF

任何修复这个bash脚本的帮助。

感谢

我已经尝试并删除了docker-compose文件中的引用

environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASS}
MONGO_INITDB_DATABASE: ${MONGO_DB_NAME}

,直接在init文件中创建admin用户。

#!/bin/bash
set -e
mongosh <<EOF
use admin 
db.createUser(
{
user: "${MONGO_USER}",
pwd: "${MONGO_PASS}",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
use ${MONGO_DB_NAME}
db.createCollection("users")
db.users.insert({"name": "john"})
EOF

UPDATED - 2023年3月

此外还有另外两个问题我有-我现在更新如下:当引用这个脚本

时,我遇到了身份验证问题。
  1. 这是因为新的mongo连接使用'mongosh'而不是'mongo'。所以脚本现在是mongosh <<EOF -不是mongo <<EOF
  2. 我必须清除我的docker卷(因为初始化脚本)只有在卷尚未创建时才运行-即docker volume rm volume-mongo或docker volume prune

为mongo

创建重新运行和测试身份验证的步骤如下
  1. docker container rm mongo1
  2. docker-compose
  3. docker exec -it mongo1 mongosh admin -u MONGO_USER -p MONGO_PASS

最新更新