在Compose中使用生命周期钩子

Introduced in Docker Compose version 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

参考信息