將生命週期掛鉤與 Compose 搭配使用

Docker Compose 版本 2.30.0 中引入

服務生命週期掛鉤

當 Docker Compose 執行容器時,它會使用兩個元素,ENTRYPOINT 和 COMMAND,來管理容器啟動和停止時發生的情況。

但是,有時使用生命週期掛鉤單獨處理這些任務會更容易 - 這些命令會在容器啟動後立即執行,或在容器停止前執行。

生命週期掛鉤特別有用,因為它們可以擁有特殊權限(例如以 root 使用者身分執行),即使容器本身以較低權限執行以確保安全。這表示某些需要較高權限的任務可以在不損害容器整體安全性的情況下完成。

啟動後掛鉤

啟動後掛鉤是在容器啟動後執行的命令,但沒有設定它們確切執行的時間。在執行容器的 `entrypoint` 期間,無法保證掛鉤執行的時機。

在提供的範例中

  • 掛鉤用於將磁碟區的所有權變更為非 root 使用者(因為磁碟區預設是以 root 所有權建立的)。
  • 容器啟動後,`chown` 命令會將 `/data` 目錄的所有權變更為使用者 `1001`。
services:
  app:
    image: backend
    user: 1001
    volumes:
      - data:/data    
    post_start:
      - command: chown -R /data 1001:1001
        user: root

volumes:
  data: {} # a Docker volume is created with root ownership

停止前掛鉤

停止前掛鉤是在容器被特定命令(例如 `docker compose down` 或使用 `Ctrl+C` 手動停止它)停止之前執行的命令。如果容器自行停止或突然被終止,則這些掛鉤將不會執行。

在以下範例中,在容器停止之前,會執行 `./data_flush.sh` 腳本來執行任何必要的清除作業。

services:
  app:
    image: backend
    pre_stop:
      - command: ./data_flush.sh

參考資訊