将生命周期钩子与 Compose 结合使用
目录
服务生命周期钩子
当 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