Docker 容器不使用卷

问题描述 投票:0回答:1

我想我不明白 Docker 卷是如何工作的。我有一个 docker compose 文件,其中包含一个运行 laravel 应用程序的应用程序服务、一个 postgres 服务和一个 memcached 服务。我为 laravel 存储和 postgres 命名了卷,但这些卷没有任何内容持久化。如果我查看文件查找器,文件夹中没有文件,当我关闭数据库容器时,数据就会丢失。

docker-compose.yaml:

services:
  app:
    build:
      context: .
    entrypoint: php artisan octane:frankenphp
    ports:
      - "80:8000"
      - "443:443"
      - "443:443/udp" # HTTP/3
      - "5173:5173"
    depends_on:
      - db
      - cache
    volumes:
      - storage:/path/to/laravel/base/storage
      - ../:/app
    networks:
      - storefront
      - backroom
  db:
    image: postgres:latest
    restart: unless-stopped
    volumes:
      - data:/path/where/I/want/db/data
    environment:
      POSTGRES_USER: user
      POSTGRES_DB: db
      POSTGRES_PASSWORD: "password"
    networks:
      - backroom

  cache:
    image: memcached:latest
    restart: unless-stopped
    networks:
      - backroom

networks:
  storefront:
  backroom:

volumes:
  data:
  storage:

这条线似乎有效:

  • ../:/应用程序 当我在应用程序服务容器内执行操作时,我可以看到本地文件系统中的更改。例如,如果我使用composer添加一个包,我可以稍后在VS Code中查看composer.json,新的包就在那里。但这两个指定的卷似乎没有做任何事情。

容器进行通信 - php artisan migrate 和 php artisan db:seed 在 postgres 中创建表和记录 - 但数据不会持久。

谢谢你

php postgresql docker docker-compose volumes
1个回答
0
投票

在 Docker 中,该标题下指定了两种不同类型的“卷”。一个实际上是 docker 卷,另一个是“绑定挂载”。

这是一个 docker 卷:

  - storage:/path/to/laravel/base/storage

它们不是常规文件系统的一部分,而是由 docker 管理。当第一部分只是一个没有 / 的名称时,它将是一个卷。

这是绑定安装:

  - ../:/app

它们基本上是 Docker 容器和文件系统之间的映射。它们指定一个路径,而不仅仅是一个卷名称。

结论

您所看到的是正确的。并且卷中的数据will实际上会持续存在,只是不在您可以在普通文件系统上查看和管理的目录中。

您对各种事物使用哪种类型最终取决于您,但我建议您阅读各卷、其目的、如何使用它们以及任何优点/缺点,以便您做出明智的选择。

© www.soinside.com 2019 - 2024. All rights reserved.