如何在docker-compose之后运行Mongo shell命令?

问题描述 投票:2回答:2

我想启动这个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(..)",这可能会使事情变得更容易。

我的问题是如何在mongo 1,mongo 2,mongo3启动后运行此命令?

mongodb docker docker-compose
2个回答
1
投票

你可以这样做,我最近不得不运行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--host mongo3来解决所有三个MongoDB问题。您将在脚本中的两个eval命令中使用它。

相信我使用的SO答案https://stackoverflow.com/a/45060399/4295037until mongo ...)。


-1
投票

我假设您正在使用Oficial Mongo图像,该图像配置为:

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["mongod"]

如果你检查docker-entrypoint.sh,你会发现你可以通过覆盖CMD来运行你想要的任何命令。

所以,你可以为每个mongo容器做

$ docker run -d mongo
9bf0473d491a2d7ae821bcf10ed08cd49678d28e46344589622bd9440a6aca65

$ docker ps -q
9bf0473d491a

$ docker exec -ti 9bf0473d491a mongo --eval "rs.initiate(.....)"
MongoDB shell version v3.6.5
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.5
{
    "ok" : 0,
    "errmsg" : "This node was not started with the replSet option",
    "code" : 76,
    "codeName" : "NoReplicationEnabled"
}

请注意,errmsg只是因为在我的示例中rs.initiate()为空,它将适用于您正确的配置。

© www.soinside.com 2019 - 2024. All rights reserved.