將生命週期鉤子與 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

參考資訊