首页 > 解决方案 > 如何在 docker-compose 之后运行 Mongo shell 命令?

问题描述

我想启动这个 MongoDB 副本集:

version: "3"

services:
  mongo1:
    image: mongo
    ports:
      - 27017:27017
    command: mongod --replSet rs0
  mongo2:
    image: mongo
    ports:
      - 27018:27017
    command: mongod --replSet rs0
  mongo3:
    image: mongo
    ports:
      - 27019:27017
    command: mongod --replSet rs0

等待那些出现,然后通过终端访问 Mongo shell:

docker exec -it mongo1 mongo

然后在 Mongo shell 中执行以下操作:

rs.initiate({"_id":"rs0","members":[{"_id":0,"host":"mongo1:27017"},{"_id":1,"host":"mongo2:27017"},{"_id":2,"host":"mongo3:27017"}]})

Mongo 还允许mongo --eval "rs.initiate(..)",这可能会使事情变得更容易。

我的问题是如何在 mongo1、mongo2、mongo3 启动后运行此命令?

标签: mongodbdockerdocker-compose

解决方案


你可以这样做,我最近必须运行mongo --repair然后运行 ​​MongoDB 本身,在 MongoDB 启动后,我需要将我的用户添加到数据库,只有在所有三个 MongoDB 都启动后,你才能轻松更改运行命令。

可能的 docker-compose.yml:

version: "2"
services:
  mongo:
    container_name: mongo
    restart: on-failure:10
    image: mongo
    environment:
      - MONGO_INITDB_ROOT_USERNAME=<user>
      - MONGO_INITDB_ROOT_PASSWORD=<pass>
      - MONGO_INITDB_DATABASE=db
    volumes:
      - ./data:/data/db
    ports:
      - "27017:27017"
    command: bash -c "mongod --repair && mongod"

  mongoClient:
    image: mongo
    container_name: mongoClient
    links:
      - mongo
    volumes:
      - ./deployment_scripts:/deployment_scripts
    command: 
      - /deployment_scripts/add_user.sh
    depends_on:
      - mongo

  app:
    container_name: app
    restart: always
    build: .
    volumes:
      - .:/usr/src/app
    ports:
      - "3000:3000"
    depends_on:
      - mongoClient
    links:
      - mongo

我的/deployment_scripts/add_user.sh脚本等待 MongoDB 启动:

until mongo --host mongo --eval "print(\"waited for connection\")"
do
    sleep 1
done

// you can add more MongoDB waits here

echo "Adding user to MongoDB..."
mongo --host mongo --eval "db.createUser({ user: \"<user>\", pwd: \"<pass>\", roles: [ { role: \"root\", db: \"admin\" } ] });"
echo "User added."

请注意,您可以通过替换--host mongo为您的--host mongo1 --host mongo2和来处理所有三个 MongoDB --host mongo3。您将在脚本中的两个 eval 命令中使用它。

归功于我使用的这个 SO 答案https://stackoverflow.com/a/45060399/4295037until mongo ... ( )。


推荐阅读