卷是匿名创建的,而不是在每次撰写上/下时命名和重新创建

Bit*_*een 0 docker docker-compose

我有一些 docker 容器,可以使用 docker-compose up / down 启动和停止。在 docker-compose.yml 中,我为每个容器定义了一个卷。据我了解,这些应该显示为 var/lib/docker/volumes 下的命名卷,但我所看到的只是一堆神秘的目录,每次重新启动容器时它们的数量也会增加。

每次我重新启动容器时,当我认为我正在使用卷来避免出现这样的情况时,数据库再次为空。我想保留数据。

我做错了什么吗?

version: "3"
services:
  nftapi:
    env_file:
      - .env
    build:
      context: .
    ports:
      - '5000:5000'
    depends_on: 
      - postgres
      
    networks:
      - postgres
      
  postgres:
    container_name: postgres
    image: postgres:latest
    ports:
    - "5432:5432"
    volumes:
    - /data/postgres:/data/postgres
    env_file:
    - docker.env
    networks:
    - postgres
 
  pgadmin:
    links:
    - postgres:postgres
    container_name: pgadmin
    image: dpage/pgadmin4
    ports:
    - "8080:80"
    volumes:
    - /data/pgadmin:/root/.pgadmin
    env_file:
    - docker.env
    networks:
    - postgres
 
networks:
  postgres:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)

卷目录屏幕

在此输入图像描述

Dav*_*aze 5

Docker Hubpostgres镜像保存其数据/var/lib/postgresql/data(请参阅扩展描述中“存储数据的位置”)。您需要更改绑定安装,以便这是此处指定的第二个目录。

\n
volumes:\n  - /data/postgres:/var/lib/postgresql/data\n  #                ^^^^^^^^^^^^^^^^^^^^^^^^\n  #            second half must be this exact path\n
Run Code Online (Sandbox Code Playgroud)\n

这就是为什么您看不到数据保留在主机目录中的原因;它安装在错误的路径上。

\n

同时,图像Dockerfile 包含VOLUME该目录的声明。如果该目录没有安装任何其他内容,这会导致 Docker 为该目录创建一个匿名卷。这docker-compose down指出:

\n
\n

默认情况下 [by] 不会删除匿名卷docker-compose down。但是,由于它们没有\xe2\x80\x99t 稳定的名称,因此后续的up.

\n
\n

这就是为什么您也看不到重新启动后保留的数据库数据;修复安装路径将解决这个问题。

\n

(在前面的问题中,您询问额外的卷来自哪里,它是由 Dockerfile 创建的匿名卷VOLUME@larsks 的答案对命名卷和绑定安装之间的差异进行了很好的讨论;匿名卷他们在答案末尾提到的卷是相同的VOLUME机制。)

\n