首页 > 解决方案 > 如何为 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 脚本的任何帮助表示赞赏。

谢谢

标签: mongodbbashdockerdocker-compose

解决方案


我已经尝试并删除了 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


推荐阅读