卷是匿名创建的,而不是命名并在每次向上/向下合成时重新创建 [英] Volumes being created anonymously instead of named and re-created on every compose up / down

查看:18
本文介绍了卷是匿名创建的,而不是命名并在每次向上/向下合成时重新创建的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个码头容器,我使用docker-composeup/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

卷目录屏幕

推荐答案

Docker Hub postgres image将其数据保存在/var/lib/postgresql/data中(参见"Where to store data" in the extended description)。您需要更改绑定挂载,使其成为其中命名的第二个目录。

volumes:
  - /data/postgres:/var/lib/postgresql/data
  #                ^^^^^^^^^^^^^^^^^^^^^^^^
  #            second half must be this exact path

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

同时,图像的Dockerfilecontains a VOLUME declaration for that directory。这会导致Docker在没有装载任何其他内容的情况下为该目录创建匿名卷。docker-compose down文档说明:

默认情况下不会删除匿名卷[由docker-compose down删除]。但是,由于它们没有稳定的名称,后续的up将不会自动装入它们。

这就是为什么您在重新启动后也看不到数据库数据保留的原因;修复挂载路径将解决此问题。

(在an earlier question中,您询问额外的卷来自哪里,它是由DockerfileVOLUME创建的匿名卷。@larsks's answer很好地讨论了命名卷和绑定装载之间的区别;它们在答案末尾提到的匿名卷都是相同的VOLUME机制。)

这篇关于卷是匿名创建的,而不是命名并在每次向上/向下合成时重新创建的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆