在 Docker Compose 中定義和管理卷
卷是容器引擎實現的持久資料儲存。Compose 提供了一種中立的方式,讓服務掛載卷,以及配置引數來將它們分配給基礎設施。頂層的 `volumes` 宣告允許您配置可在多個服務中重用的命名卷。
要在多個服務中使用卷,您必須透過在 `services` 頂層元素中使用 volumes 屬性來顯式授予每個服務訪問許可權。`volumes` 屬性具有提供更精細控制的其他語法。
提示正在處理大型倉庫或monorepos,或者虛擬檔案系統無法再與您的程式碼庫一起擴充套件?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` 部分下的條目可以為空,在這種情況下,它使用容器引擎的預設配置來建立卷。或者,您可以使用以下鍵進行配置
驅動程式
指定應使用哪個卷驅動程式。如果驅動程式不可用,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"
外部
如果設定為 `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.project` 和 `com.docker.compose.volume` 標籤。
name
`name` 為卷設定自定義名稱。名稱欄位可用於引用包含特殊字元的卷。該名稱按原樣使用,並且不與堆疊名稱關聯。
volumes:
db-data:
name: "my-app-data"
這使得將此查詢名稱作為 Compose 檔案的引數成為可能,這樣卷的模型 ID 就被硬編碼,但平臺上的實際卷 ID 在部署時在執行時設定。
例如,如果 `DATABASE_VOLUME=my_volume_001` 在您的 `.env` 檔案中
volumes:
db-data:
name: ${DATABASE_VOLUME}
執行 `docker compose up` 將使用名為 `my_volume_001` 的卷。
它還可以與 `external` 屬性結合使用。這意味著用於在平臺上查詢實際卷的名稱與用於在 Compose 檔案中引用卷的名稱是分開設定的
volumes:
db-data:
external: true
name: actual-name-of-volume