docker:创建一个在 docker-compose 关闭后仍然保存的 mongodb 卷?

jav*_*900 2 persistence mongodb docker docker-compose docker-volume

我有以下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
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我运行docker-compose downmongo 数据库中的所有数据都会丢失。

如何创建即使 mongo 容器出现故障也能持续存在的 mongo 卷?

BMi*_*tch 6

根据图像文档,数据库卷需要为/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
Run Code Online (Sandbox Code Playgroud)

请注意,除非您需要直接访问主机上的此数据,否则我建议您使用命名卷。它包括初始化步骤,可帮助您解决主机卷可能遇到的权限问题,特别是直接在 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:
Run Code Online (Sandbox Code Playgroud)