#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. Правильно, я обновил ответ, чтобы иметь ссылку на официальный документ об этом.