docker 如何为www.example.com:ro编写bash脚本init-mongo.sh以添加管理员用户并运行初始化脚本

4urapxun  于 2023-03-29  发布在  Docker
关注(0)|答案(1)|浏览(124)

当我添加docker-entrypoint-initdb.d/ www.example.com:ro文件时,我的mongo docker compose无法进行身份验证init-mongo.sh

对接合成

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

.环境

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

如果这个理论是正确的,那么将它包含到我的脚本中并进行额外的更改似乎是一个很好的解决方案。唯一的问题是在我的vscode中,使用shell-format扩展,这个代码组合的颜色编码看起来不正确,所以我怀疑它是错误的。

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脚本的人都很感激。
谢谢

krcsximq

krcsximq1#

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

已更新-2023年3月

此外,还有两个其他问题,我已经更新如下:我在引用此脚本时遇到了身份验证问题
1.这是因为新的mongo连接使用'mongosh'而不是'mongo',所以脚本现在是mongosh〈〈EOF - NOT mongo〈〈EOF
1.我不得不清除我的docker卷(因为init脚本)只有在卷尚未创建时才运行-即docker卷rm volume-mongo或docker卷prune
以下步骤重新运行-并为mongo创建了测试身份验证

  1. docker container rm mongo1
    1.装卸工装配
  2. docker exec -it mongo1 mongosh admin -u MONGO_USER -p MONGO_PASS

相关问题