Официальный образ 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