mongodb - 如何为 init-mongo.sh:ro 编写 bash 脚本以添加管理员用户并运行初始化脚本
问题描述
当我添加 docker-entrypoint-initdb.d/init-mongo.sh:ro 文件时,我的 mongo 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-mongo.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
如果该理论是正确的,那么将其与我的附加更改一起包含在我的脚本中似乎是一个很好的解决方案。唯一的问题是在我的带有 shell 格式扩展的 vscode 中,这个代码组合的颜色编码看起来不正确,所以我怀疑它是错误的。
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}
而是直接在初始化文件中创建管理员用户。
#!/bin/bash
set -e
mongo <<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
推荐阅读
- javascript - 最短路径的中继系统(计算起点和终点之间的中继点)
- python - 如何将一个数组附加到另一个数组,同时在 Python 中保持两个数组彼此分开
- android - Intent.createChooser 取消并再次共享后乘以选择器
- typescript - 如何在我的声明文件中从库中导入和引用类型
- r - 尽管“na.action”设置为“na.roughfix”,但缺少值错误
- php - Laravel - 找不到列:'full_name'
- namespaces - Sphinx 是改名为 Sphinx-doc,还是只是 Sphinx?
- python - 我需要将列表元素保存在单独的列表中
- typescript - Forge Viewer 的 TypeScript 定义缺少与配置文件相关的类型
- android - 如何在 kotlin 中创建一个简单的 firebase 搜索查询