docker: создать том mongodb, который все еще сохраняется после docker -создания? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть следующий docker-compose.yml файл:

version: "3"

services:

  pokerstats:
    image: pokerstats
    container_name: pokerstats
    ports:
      - 8080:8080
    depends_on: 
      - db

  db:
    image: mongo
    container_name: mongo
    volumes:
      - ./database:/data
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
      MONGO_INITDB_DATABASE: pokerstats

Моя проблема в том, что при запуске docker-compose down все данные в моей базе данных mon go теряются.

Как я могу создать том mon go, который сохраняется, даже когда контейнер mon go выходит из строя?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Согласно документации изображения том базы данных должен быть /data/db. Это также видно в томе Dockerfile .

Поскольку том определен в Dockerfile, если вы не создаете том в этом каталоге, даже если вы создали том в родительском файле как /data, docker создаст анонимный том на /data/db, который будет отображаться как длинное имя тома guid в docker volume ls. В зависимости от того, как работает контейнер, они могут остаться позади.

Поэтому исправление состоит в том, чтобы отрегулировать монтирование тома по этому пути:

version: "3"

services:

  pokerstats:
    image: pokerstats
    container_name: pokerstats
    ports:
      - 8080:8080
    depends_on: 
      - db

  db:
    image: mongo
    container_name: mongo
    volumes:
      - ./database:/data/db
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
      MONGO_INITDB_DATABASE: pokerstats

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


Для использования именованного тома это будет выглядеть следующим образом:

version: "3"

services:

  pokerstats:
    image: pokerstats
    container_name: pokerstats
    ports:
      - 8080:8080
    depends_on: 
      - db

  db:
    image: mongo
    container_name: mongo
    volumes:
      - dbdata:/data/db
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
      MONGO_INITDB_DATABASE: pokerstats

volumes:
  dbdata:
0 голосов
/ 10 апреля 2020

Попробуйте изменить volumes для контейнера MongoDb:

volumes:
  - "./database:/data/db"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...