使用 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

参考信息