Почему данные сохраняются в доке mongo? - PullRequest
0 голосов
/ 26 сентября 2018

Насколько я понимаю, новые контейнеры не должны сохранять данные после их смерти.

Сейчас у меня есть два файла Docker.Один для моего приложения, а другой для заполнения базы данных.

Это структура моего проекта

/
 package.json
 Dockerfile
 docker-compose.yml
 mongo-seeding/
   Dockerfile
   seedDatabase.mjs

Вот так выглядит мой seedDatabase

import mongodb from "mongodb";
import data from "./dummyData";

// Connection URL
const url = "mongodb://mongo:27017/poc";

async function mongoSeeder() {
  try {
    // first check to see if the database exists
    const client = await mongodb.MongoClient.connect(url);
    const db = client.db("poc");
    const questionCollection = await db.createCollection("question");
    const answerCollection = await db.createCollection("answer");
    await questionCollection.insertMany(data.questions);
    await answerCollection.insertMany(data.answers);
  } catch (e) {
    console.log(e);
  }
}

mongoSeeder();

Это мой Dockerfile для заполнения базы данныхвыглядит так:

FROM node:10

WORKDIR /usr/src/app
COPY package*.json ./
COPY mongo-seeding mongo-seeding
RUN yarn add mongodb uuid faker

CMD ["yarn", "seed"]

Вот так выглядит другой Dockerfile

FROM node:10

WORKDIR /usr/src/app
COPY package*.json ./
RUN yarn install
RUN yarn add mongodb uuid faker
RUN yarn global add nodemon babel-cli babel-preset-env
COPY . .
EXPOSE 3000
CMD ["yarn", "dev-deploy"]

Так выглядит мой docker-compose.yml

version: "3"
services:
  mongo:
    container_name: mongo
    image: mongo
    ports:
      - "4040:27017"
    expose:
      - "4040"
  app:
    container_name: ingovguru
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - mongo
    links:
      - mongo
    expose:
      - "3000"
  seed:
    container_name: seed
    build:
      context: .
      dockerfile: ./mongo-seeding/Dockerfile
    links:
      - mongo
    depends_on:
      - mongo
      - app

Изначально язаполнение базы данных 1000 вопросами и 200 ответами.

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

Я запускаю

docker-compose build docker-составить вверх

Я прыгаю в контейнер монго и вижу, что у меня 1000 вопросов и 100 ответов.

Я потом Ctrl-C и перезапущу.

Теперь у меня 2000 вопросов и 100 ответов.

Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Проблема, с которой вы столкнулись, заключается в том, что образ mongo определил некоторые тома в своем Dockerfile, вы можете видеть, что они делают:*) созданные тома сохраняются.Если вы хотите удалить контейнер и его тома, вы можете удалить остановленный контейнер Монго с помощью docker rm CONTAINER_ID или удалить все контейнеры, созданные с помощью compose с помощью docker-compose down.

В вашем случае, если вы хотите создатьи запустить службы, вы должны сделать:

docker-compose build && docker-compose down && docker-compose up  -d
0 голосов
/ 26 сентября 2018

Даже если вы не объявляете какие-либо тома, само изображение mongo объявляет тома для /data/db и /data/configdb в контейнерах, которые охватывают данные базы данных (см. Dockerfile # L87 ).При использовании Docker Compose эти анонимные тома повторно используются между вызовами docker-compose up и docker-compose down.

Чтобы удалить тома при сбое стека, необходимо использовать параметр -v, --volumes.Это удалит тома и даст вам чистую базу данных при следующем запуске.

docker-compose down --volumes

докерская документация

-v, --volumes           Remove named volumes declared in the `volumes`
                        section of the Compose file and anonymous volumes
                        attached to containers.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...