Мне нужно создать изображение монго с некоторой коллекцией и данными по умолчанию. Я могу создать изображение монго с этими данными, перейдя по следующей ссылке: -
Как создать образ Mongo Docker с коллекциями и данными по умолчанию?
поэтому, когда я запускаю контейнер, я получаю данные по умолчанию. Теперь, когда я использую приложение, создается еще несколько данных (путем вызова API), которые снова сохраняются в mongodb с данными по умолчанию.
Теперь по какой-то причине, если док-контейнер перезапускается, к сожалению, все данные, созданные во время выполнения, исчезают, и остаются только данные по умолчанию. Хотя я сохраняю данные объемами.
Итак, как сохранять данные времени выполнения и данные по умолчанию при каждом перезапуске докера? Я использую следующий файл докеров и файл для создания докеров
Dockerfile:
FROM mongo
####### working isnerting data $##########
# Modify child mongo to use /data/db2 as dbpath (because /data/db wont persist the build)
RUN mkdir -p /data/db2 \
&& echo "dbpath = /data/db2" > /etc/mongodb.conf \
&& chown -R mongodb:mongodb /data/db2
COPY . /data/db2
RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db2 --smallfiles \
&& mongo 127.0.0.1:27017/usaa /data/db2/config-mongo.js \
&& mongod --dbpath /data/db2 --shutdown \
&& chown -R mongodb /data/db2
# Make the new dir a VOLUME to persists it
VOLUME /data/db2
CMD ["mongod", "--config", "/etc/mongodb.conf", "--smallfiles"]
и часть docker-compose.yml
services:
mongo:
build: ./mongodb
image: "mongo:1.2"
container_name: "mongo"
ports:
- "27017:27017"
volumes:
- ${LOCAL_DIRECTORY}:/data/db2
networks:
- some-network
Причина может заключаться в том, что путем перестройки образа докера создается каталог / data / db2 только с данными по умолчанию, определенными в файле .js. Но не уверен.
Исправьте, что я делаю неправильно, или предложите новый способ решения этой проблемы.
Большое спасибо!
Потому что докер по умолчанию не имеет состояния. Каждый раз, когда вы вызываете docker run
, он перестраивает контейнер. Если вы хотите, чтобы некоторые данные сохранялись, у вас есть 2 общих подхода:
Не снимать тару после выхода. Просто дайте своему контейнеру красивое имя при первом запуске, например docker run --name jessica mongo
, а затем, при последующих вызовах, используйте docker start jessica
.
Используйте тома для хранения данных и обмена ими между контейнерами. В этом случае вы запустите свой контейнер с аргументами объема, такими как docker run -v /home/data:/data mongo
. Кроме того, вам придется перенастроить mongodb
для сохранения данных по пути /data
внутри контейнера. Этот подход проще и может использоваться для обмена данными между разными контейнерами, а также для предоставления данных по умолчанию для первого запуска.
При использовании docker-compose
для запуска контейнеров, если вам нужно, чтобы ваши данные сохранялись между сеансами, вы можете просто использовать тома внешний, которые вы создаете заранее.
Сначала создайте том, скажем, lovely
:
docker volume create lovely
Затем используйте его в docker-compose.yml
:
version: '3'
services:
db1:
image: whatever
volumes:
- lovely:/data
db2:
image: whatever
volumes:
- lovely:/data
volumes:
lovely:
external: true
VOLUME / data / db2 Итак, эта команда в файле докеров удаляет все ранее сохраненные смонтированные данные? Не должно быть?
Спасибо @grapes за быстрые предложения. Я использую docker-compose up & down, поэтому он также удалит контейнер, поэтому первый вариант здесь не будет хорошим решением. Я придерживаюсь подхода, упомянутого во втором пункте. Я создал папку / data / db2 и настроил mongo для сохранения данных в / data / db2, но также я смонтировал тот же каталог с моей системой папок, чтобы сохранить изменения данных. Это тоже работает. Но когда снова запускается compose up, он удаляет все данные, сохраненные в $ {LOCAL_DIRECTORY}. Таким образом, все данные времени выполнения исчезли.