为什么数据会保留在 mongo docker 容器中?

pra*_*432 3 mongodb docker

根据我的理解,新容器在死后不应该保留数据。

现在我有两个 Dockerfile。一个用于我的应用程序,另一个用于为数据库做种子。

这是我的项目结构

/
 package.json
 Dockerfile
 docker-compose.yml
 mongo-seeding/
   Dockerfile
   seedDatabase.mjs
Run Code Online (Sandbox Code Playgroud)

这是我的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();
Run Code Online (Sandbox Code Playgroud)

这就是我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"]
Run Code Online (Sandbox Code Playgroud)

这是另一个 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"]
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

最初,我为数据库设置了 1000 个问题和 200 个答案。

请注意,我没有使用任何卷,因此不应保留任何内容。

我跑

docker-compose 构建 docker-compose up

我跳入 mongo 容器,我看到我有 1000 个问题和 100 个答案。

然后我又Ctrl-C重新跑了。

我现在有 2000 个问题和 100 个答案。

为什么会发生这种情况?

Kin*_*ang 5

即使您没有声明任何卷,mongo 映像本身也会为容器/data/db/data/configdb在容器中声明卷,这些卷涵盖了数据库数据(请参阅Dockerfile#L87)。使用 Docker Compose,这些匿名卷在docker-compose up和 的调用之间重复使用docker-compose down

要在关闭堆栈时删除卷,您需要使用该-v, --volumes选项。这将删除卷,为您提供一个干净的数据库。

docker-compose down --volumes
Run Code Online (Sandbox Code Playgroud)

docker-compose down 文档

-v, --volumes           Remove named volumes declared in the `volumes`
                        section of the Compose file and anonymous volumes
                        attached to containers.
Run Code Online (Sandbox Code Playgroud)