Как запустить команду оболочки Mongo после docker-compose? - PullRequest
0 голосов
/ 26 мая 2018

Я хотел бы запустить этот набор реплик 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 через терминал:

docker exec -it mongo1 mongo

Затем в оболочке Mongodo:

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 подняты?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вы можете сделать это, мне недавно пришлось запустить 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."

Обратите внимание, что вы можетеобратитесь ко всем трем своим MongoDB, заменив --host mongo на --host mongo1 --host mongo2 и --host mongo3.Вы будете использовать это для обеих команд eval в сценарии.

Благодарим за этот ответ SO https://stackoverflow.com/a/45060399/4295037, который я использовал (until mongo ...).

0 голосов
/ 26 мая 2018

Я предполагаю, что вы используете Официальный 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 () пуст,это будет работать для вас с правильным конфигом.

...