在 Compose 中使用生命週期掛鉤

要求: Docker Compose 2.30.0 或更高版本

服務生命週期掛鉤

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

然而,有時將這些任務與生命週期掛鉤分開處理會更方便,這些掛鉤是在容器啟動後或停止前立即執行的命令。

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

啟動後掛鉤 (Post-start hooks)

啟動後掛鉤 (Post-start hooks) 是在容器啟動後執行的命令,但它們的具體執行時間並不固定。在容器的 entrypoint 執行期間,掛鉤的執行時機並不保證。

在提供的範例中

  • 該掛鉤用於將磁碟區 (volume) 的擁有權更改為非 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

停止前掛鉤 (Pre-stop hooks)

停止前掛鉤 (Pre-stop hooks) 是在容器被特定命令(例如 docker compose down 或手動使用 Ctrl+C 停止)停止之前執行的命令。如果容器自行停止或被強制終止,這些掛鉤將不會執行。

在下面的範例中,在容器停止之前,會執行 ./data_flush.sh 指令碼來執行任何必要的清理工作。

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

參考資訊

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.