Попытка создать образ Docker с базой данных MongoDB, но у контейнера его нет, даже если он успешно загружен - PullRequest
0 голосов
/ 04 марта 2019

Данные в базе данных предназначены для отображения с помощью API в другом контейнере.Ранее я успешно загрузил базу данных во время выполнения, используя это предложение .Тем не менее, моя база данных довольно большая (10 ГБ), и в идеале мне не пришлось бы загружать базу данных каждый раз, когда я запускаю новый контейнер.Я хочу, чтобы база данных загружалась при сборке.Чтобы сделать это, я попробовал следующее для моего Dockerfile:

FROM mongo:4.0.6-xenial

COPY dump /data/dump

RUN mongod --fork --logpath /var/log/mongod.log \
&& mongorestore /data/dump \
&& mongo --eval "db.getSiblingDB('db').createUser({user:'user',pwd:'pwd',roles:['readWrite']})" \
&& mongod --shutdown

Я ожидал, что база данных будет в контейнере, когда я запустил этот образ, но это не так, и пользователь не существует.Тем не менее, файл журнала /var/log/mongod.log указывает, что база данных успешно загружена, насколько я могу судить.Почему это не сработало?

1 Ответ

0 голосов
/ 05 марта 2019

Официальный образ Docker записывает данные базы данных в томе Docker .

Во время выполнения (например, в контейнере Docker) имейте в виду, что файлы, записанные в тома, не в конечном итоге записываются в файловую систему контейнера.Это сделано для того, чтобы сохранить ваши данные, чтобы они выдержали удаление контейнера, но, что более важно, в контексте базы данных, из соображений производительности.Чтобы обеспечить хорошую производительность ввода-вывода с дисками, дисковые операции должны выполняться на томе, а не в самой файловой системе контейнера.

Во время сборки (например, при создании образа докера), если у вас естьДирективы RUN / ADD / COPY в вашем Dockerfile записывают файлы в место, которое уже объявлено как том, эти файлы будут отброшены.Однако если вы записываете файлы в каталог в своем Dockerfile, и только после того, как вы объявите этот каталог как том, эти тома сохранят эти файлы, если вы не запустите свой контейнер, указав том с параметром docker run -v.

Это означает, что в случае, если ваш собственный Dockerfile собран FROM mongo, местоположение /data уже объявлено как том.Запись файлов в это место не имеет смысла.

Что можно сделать?

Создание собственного монго-изображения с нуля

Зная, как работают тома, вы можете скопировать содержимое изDockerfile официального образа Docker монго и вставьте директиву RUN / ADD / COPY, чтобы записать нужные файлы в папку /data/db до директивы VOLUME /data/db /data/configdb.

Переопределить точку входа

Предполагая, что у вас есть архив tar с именем mongo-data-db.tar с содержимым местоположения /data/db из контейнера mongo, содержащего всю необходимую базу данных и коллекции, вы можете использовать следующее Dockerfile и copy-initial-data-entry-point.sh , вы можете создать образ, который будет копировать эти данные в местоположение /data/db при каждом запуске контейнера. Это имеет смысл только в том случае, когда такой контейнер используется для набора тестов, который запрашивает одни и те же исходные данные при каждом запуске такого контейнера, поскольку предыдущие данные заменяются начальными данными при каждом запуске.

Dockerfile:

FROM mongo
COPY ./mongo-data-db.tar /mongo-data-db.tar
COPY ./copy-initial-data-entry-point.sh /
RUN chmod +x /copy-initial-data-entry-point.sh
ENTRYPOINT [ "/copy-initial-data-entry-point.sh"]
CMD ["mongod"]

copy-initial-data-entry-point.sh:

#!/bin/bash
set -e

tar xf /mongo-data-db.tar -C /
exec /usr/local/bin/docker-entrypoint.sh "$@"

Чтобы извлечь содержимое /data/db из тома контейнера монго с именем my-mongo-container, выполните следующие действия:

  • остановка контейнера монго: docker stop my-mongo-container
  • создайте временный контейнер для создания архива tar из тома: docker run --rm --volumes-from my-mongo-container -v $(pwd):/out ubuntu tar cvf /out/mongo-data-db.tar

Обратите внимание, что этот архив будет довольно большим, поскольку он содержит полное содержимое данных сервера mongo, включая индексы какописан в документации mongo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...