docker:创建一个 mongodb 卷,在 docker-compose down 后仍然保存?

docker: create a mongodb volume that is still saved after docker-compose down?

我有以下 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 我的 mongo 数据库中的所有数据都丢失了。

如何创建一个 mongo 卷,即使在 mongo 容器出现故障时仍然存在?

尝试为 MongoDb 容器更改 volumes

volumes:
  - "./database:/data/db"

根据 image documentation the database volume needs to be /data/db. This is also seen in the Dockerfile volume.

由于卷是在Dockerfile中定义的,如果你不在该目录创建卷,即使你在父目录中创建了一个卷,如/data,docker也会创建一个匿名的/data/db 处的卷将在 docker volume ls 中显示为长 GUID 卷名称。根据容器的情况 运行,这些可能会被遗忘。

因此,解决方法是将您的卷安装调整到该路径:

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: