在 Compose 中使用生命周期钩子

在 Docker Compose 版本 2.30.0 中引入

服务生命周期钩子

当 Docker Compose 运行容器时,它使用两个元素,即 ENTRYPOINT 和 COMMAND, 来管理容器启动和停止时发生的情况。

但是,有时使用生命周期钩子单独处理这些任务会更容易 - 在容器启动后或停止之前运行的命令。

生命周期钩子特别有用,因为它们可以具有特殊权限 (例如以 root 用户身份运行),即使容器本身以较低的权限运行 为了安全。这意味着某些需要更高权限的任务可以在没有 损害容器的整体安全性。

后启动钩子

Post-start 钩子是在容器启动后运行的命令,但没有 设置执行时间。在 执行容器的 .entrypoint

在提供的示例中:

  • 该钩子用于将卷的所有权更改为非 root 用户(因为卷 默认使用 root 所有权创建)。
  • 容器启动后,该命令将目录的所有权更改为 user 。chown/data1001
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 downCtrl+C

在以下示例中,在容器停止之前,脚本为 run 执行任何必要的清理。./data_flush.sh

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

参考资料