Как сохранить данные по умолчанию и запустить данные приложения mongo db с образами докеров и компоновкой докеров

Мне нужно создать изображение монго с некоторой коллекцией и данными по умолчанию. Я могу создать изображение монго с этими данными, сославшись на следующую ссылку: -

Как создать образ Mongo Docker с помощью коллекции и данные по умолчанию?

поэтому, когда я запускаю контейнер, я получаю данные по умолчанию. Теперь, когда я использую приложение, генерируются дополнительные данные (путем вызова API), которые снова сохраняются в mongodb с данными по умолчанию.

Теперь по какой-то причине, если контейнер Docker перезапускается, к сожалению, все данные, созданные во время выполнения, исчезают, и остаются только данные по умолчанию. Хотя я сохраняю данные, используя тома.

Итак, как сохранить данные времени выполнения и данные по умолчанию при каждом перезапуске докера? Я использую следующий файл докеров и файл для создания докеров

Докерфайл:

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. Но не уверен.

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

Спасибо большое!


person Prakhar Patidar    schedule 18.12.2018    source источник


Ответы (1)


Потому что докер по умолчанию не имеет состояния. Каждый раз, когда вы вызываете docker run, контейнер перестраивается. Если вы хотите, чтобы некоторые данные сохранялись, у вас есть два общих подхода:

  1. Не удалять контейнер после его выхода. Просто дайте красивое имя вашему контейнеру при первом запуске, например docker run --name jessica mongo, а затем при последующих вызовах используйте docker start jessica

  2. Используйте тома для хранения данных и обмена ими между контейнерами. В этом случае вы начнете свой контейнер с аргументами объема, такими как 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
person grapes    schedule 18.12.2018
comment
Спасибо @grapes за быстрые предложения. Я использую docker-compose up & down, поэтому он также удалит контейнер, поэтому первый вариант здесь не будет хорошим решением. Я следую подходу, упомянутому во втором пункте. Я создал папку /data/db2 и настроил mongo для сохранения данных в /data/db2, но также я смонтировал тот же каталог с моей системой папок, чтобы сохранить изменения данных. Это тоже работает. Но когда снова запускается compose up, он удаляет все данные, сохраненные в $ {LOCAL_DIRECTORY}. Таким образом, все данные о времени выполнения исчезли. - person Prakhar Patidar; 19.12.2018
comment
VOLUME /data/db2 Итак, эта команда в файле докера удаляет все ранее сохраненные смонтированные данные? Не должно быть правильно? - person Prakhar Patidar; 22.09.2019