磁碟區頂層元素

磁碟區是由容器引擎實作的永久性資料儲存區。Compose 提供了一種中立的方式讓服務掛載磁碟區,以及配置參數來將它們分配給基礎架構。頂層 `volumes` 宣告允許您設定可在多個服務之間重複使用的具名磁碟區。

要在多個服務之間使用磁碟區,您必須使用 `services` 頂層元素中的 volumes 屬性明確地授予每個服務的存取權限。`volumes` 屬性具有提供更精細控制的其他語法。

提示

正在使用大型儲存庫或 monorepo,或者使用不再與您的程式碼庫一起調整的虛擬檔案系統?Compose 現在利用同步檔案共用並自動為繫結掛載建立檔案共用。請確保您已使用付費訂閱登入 Docker,並在 Docker Desktop 的設定中啟用了**存取實驗性功能**和**使用 Compose 管理同步檔案共用**。

範例

以下範例顯示了一個雙服務設定,其中資料庫的資料目錄與另一個服務共用為一個名為 `db-data` 的磁碟區,以便定期備份。

services:
  backend:
    image: example/database
    volumes:
      - db-data:/etc/data

  backup:
    image: backup-service
    volumes:
      - db-data:/var/lib/backup/data

volumes:
  db-data:

`db-data` 磁碟區分別掛載在備份和後端的 `/var/lib/backup/data` 和 `/etc/data` 容器路徑上。

執行 `docker compose up` 會在磁碟區不存在時建立它。否則,將使用現有的磁碟區,如果在 Compose 之外手動刪除它,則會重新建立它。

屬性

頂層 `volumes` 區段下的項目可以是空的,在這種情況下,它會使用容器引擎的預設配置來建立磁碟區。或者,您可以使用以下鍵進行設定

driver

指定應使用的磁碟區驅動程式。如果驅動程式無法使用,Compose 將會傳回錯誤,並且不會部署應用程式。

volumes:
  db-data:
    driver: foobar

driver_opts

driver_opts 指定要傳遞給此磁碟區驅動程式的選項清單,以鍵值對的形式呈現。選項會因驅動程式而異。

volumes:
  example:
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"

external

如果設定為 true

  • external 指定此磁碟區已存在於平台上,且其生命週期是由應用程式外部管理。Compose 接著不會建立磁碟區,如果磁碟區不存在,則會傳回錯誤。
  • 除了 name 之外的所有其他屬性皆不相關。如果 Compose 偵測到任何其他屬性,它會拒絕 Compose 檔案,視為無效。

在以下範例中,Compose 不會嘗試建立名為 {project_name}_db-data 的磁碟區,而是尋找一個名為 db-data 的現有磁碟區,並將其掛載到 backend 服務的容器中。

services:
  backend:
    image: example/database
    volumes:
      - db-data:/etc/data

volumes:
  db-data:
    external: true

labels

labels 用於將中資料新增至磁碟區。您可以使用陣列或字典。

建議您使用反向 DNS 標記法,以避免您的標籤與其他軟體使用的標籤衝突。

volumes:
  db-data:
    labels:
      com.example.description: "Database volume"
      com.example.department: "IT/Ops"
      com.example.label-with-empty-value: ""
volumes:
  db-data:
    labels:
      - "com.example.description=Database volume"
      - "com.example.department=IT/Ops"
      - "com.example.label-with-empty-value"

Compose 會設定 com.docker.compose.projectcom.docker.compose.volume 標籤。

name

name 為磁碟區設定自訂名稱。名稱欄位可用於參照包含特殊字元的磁碟區。名稱會按原樣使用,且不會以堆疊名稱作為範圍。

volumes:
  db-data:
    name: "my-app-data"

這使得可以將此查詢名稱設為 Compose 檔案的參數,以便磁碟區的模型 ID 是硬編碼的,但在平台上的實際磁碟區 ID 則是在部署期間於執行階段設定。

例如,如果您的 .env 檔案中有 DATABASE_VOLUME=my_volume_001

volumes:
  db-data:
    name: ${DATABASE_VOLUME}

執行 docker compose up 會使用名為 my_volume_001 的磁碟區。

它也可以與 external 屬性搭配使用。這表示用於在平台上查詢實際磁碟區的名稱,與用於在 Compose 檔案中參照磁碟區的名稱是分開設定的。

volumes:
  db-data:
    external: true
    name: actual-name-of-volume