Docker每次执行docker compose up命令时都会创建一个新的卷。

5
我有一个docker-compose文件,可以启动几个服务。我刚刚收到一个错误提示,说我的磁盘空间不足,所以我输入了“docker system df”,发现我有21个卷。如果我有3个docker容器,每个容器都有一个附加的卷,为什么它显示总共有21个卷呢?
我正在使用AWS EC2。这是我的compose文件,我设置卷的方式有问题吗?当我关闭和重新启动时,postgres数据得到了持久化,但我对于卷大小和无法在T2 Large实例上重建的消息感到困惑。

version: "3"
services:
  nftapi:
    env_file:
      - .env
    build:
      context: .
    ports:
      - '443:5000'
    depends_on: 
      - postgres
    volumes: 
      - .:/app
      - /app/node_modules
    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

enter image description here


你的应用程序 node_modules 目录中的匿名卷看起来很奇怪,特别是在 EC2 上:你不想用匿名卷覆盖镜像的库树,并且通常也不想将应用程序源推送到云部署与 Docker 镜像分开。虽然这是你唯一显示的非绑定挂载卷。但是,你的镜像是否声明了不必要的 VOLUME,导致创建更多的匿名卷? - David Maze
2个回答

4
一个 Docker 镜像的 Dockerfile 可以包含一个 VOLUME 指令。这是对 Docker 的指示,告诉它某个容器目录包含需要持久化的数据,并且 Docker 应该始终确保某种类型的卷被挂载到该目录上。
更具体地说,postgres 镜像声明了。
VOLUME /var/lib/postgresql/data

您的Compose设置没有挂载任何内容到该特定目录。因此,Docker会为您创建一个匿名卷并将其挂载在那里。这不仅适用于postgres镜像,您堆栈中的其他容器可能具有类似的本地数据目录。这些匿名卷是您在docker system df输出中看到的内容(docker volume ls也会显示它们)。
稍后的问题中,您还指出Compose难以找到这些匿名卷,并且最好不要依赖此功能。通过Compose volumes:确保您将主机目录或命名卷挂载到这些数据目录上。

1

如果您的主容器正在运行,请运行以下命令:

docker volume prune

它应该删除任何容器没有使用或未附加的卷, 我习惯定期在我的 AWS 实例上运行它。

docker system prune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接