Как импортировать несколько разных коллекций с помощью импорта mongo в docker

#mongodb #docker #docker-compose #dockerfile

Вопрос:

Я пытаюсь импортировать несколько файлов json в разные коллекции в моей базе данных mongo, но сохраняется только последняя импортированная коллекция.

Это мой докер-compose.yml:

 version: "3.7"
services:
  api:
    build: .
    restart: always
    ports:
      - 8080:8080
    depends_on:
      - mongo-seed
  mongo-seed:
    build: ./mongo
    depends_on:
      - mongo_db
  mongo_db:
    image: "mongo:4.4.3"
    restart: always
    environment:
      - MONGO_INITDB_DATABASE="mongo_db"
    ports:
      - 27017:27017
 

И док-файл mongo-seed:

 FROM mongo

COPY ./data/users.json /users.json
CMD mongoimport --drop --host mongo_db --db aada_backend --collection users --type json --file /users.json --jsonArray

COPY ./data/headphones.json /headphones.json
CMD mongoimport --drop --host mongo_db --db aada_backend --collection headphones --type json --file /headphones.json --jsonArray

COPY ./data/earbuds.json earbuds.json
CMD mongoimport --drop --host mongo_db --db aada_backend --collection earbuds --type json --file /earbuds.json --jsonArray
 

Я не смог найти в Интернете ничего о том, как импортировать несколько коллекций в одну базу данных, как я могу это сделать?

Ответ №1:

Это происходит потому, что в файле Dockerfile не может быть более одной инструкции CMD. Когда вы это сделаете, будет выполнен только последний, это сделано специально. Что вы можете сделать в своем контейнере для семян —

  • скопируйте jsons в контейнер для семян
  • скопируйте сценарий оболочки, содержащий команды mongoimport, в контейнер семян
  • заставьте CMD выполнить этот сценарий.

Например:

 FROM mongo
WORKDIR /jsondata

COPY ./jsondata/ .
COPY ./seed.sh .

RUN chmod  x seed.sh

CMD ["sh", "-c", "/jsondata/seed.sh"]
 

затем в докере-составьте.yaml вы можете настроить его таким образом:

 version: "3.8"
services:
  mongo_db:
    image: mongo
    ports:
      - 27017:27017

  mongo-seed:
    build: .
    depends_on:
      - mongo_db
 

Комментарии:

1. Спасибо, это сработало :). Не знал, что вы ограничены только одной командой CMD на файл dockerfile

2. Правильно, я обновил ответ, чтобы иметь ссылку на официальный документ об этом.