Как сохранить данные по умолчанию и запустить данные приложения mongo db с образами docker и docker-compose - PullRequest
0 голосов
/ 18 декабря 2018

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

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

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

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

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

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    

Причина может быть,путем перестройки образа docker в его каталог / data / db2 создаются только данные по умолчанию, определенные в файле .js.Но не уверен.

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

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

1 Ответ

0 голосов
/ 18 декабря 2018

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

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

  2. Используйте тома для хранения данных и обмена ими между контейнерами,В этом случае вы начнете свой контейнер с аргументами тома, например docker run -v /home/data:/data mongo.Кроме того, вам придется перенастроить mongodb для сохранения данных в пути /data внутри контейнера.Этот подход проще и может использоваться для обмена данными между различными контейнерами, а также для предоставления данных по умолчанию для первого запуска

UPD

При использовании 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
...