AMI Linux下git触发post-merge钩子执行docker compose挂起问题求助
问题根因
- Git触发钩子时默认不会为钩子进程分配交互式伪终端(TTY),而
docker-compose run命令默认会开启TTY分配(隐式携带-t参数),当运行环境无可用TTY时,命令就会进入无限等待状态,表现为挂起。 - 跨平台处理差异:MacOS对无TTY场景下的TTY分配请求兼容性更高,不会触发阻塞;而AMI Linux的容器运行时对该异常场景的处理更严格,因此只会在AMI Linux上复现问题。
解决方案
你可以任选以下任意一种方案修复:
方案1:给所有docker-compose run命令添加-T参数
-T参数会显式告知docker-compose禁用伪终端分配,完美适配git钩子的无TTY运行环境,所有用到docker-compose run的行都要修改,示例如下:
# 原命令 docker-compose run --rm worker bash -c "composer install" # 修改后命令 docker-compose run --rm -T worker bash -c "composer install"
修改后的完整钩子脚本参考:
#!/bin/bash set -ex CHANGED_FILES="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)" changed() { echo "$CHANGED_FILES" | grep -q "$1" } if [[ "$USER" == "root" || "$USER" == "ec2-user" ]]; then sudo chown -R www-data: htdocs fi if changed composer.lock; then docker-compose run --rm -T worker bash -c "composer install" fi if changed "migrations\|seeders"; then docker-compose run --rm -T worker php artisan migrate --force --seed fi if changed .blade.php$; then docker-compose run --rm -T worker php artisan view:clear fi if changed .php$; then docker-compose run --rm -T worker bash -c "php artisan cache:clear && php artisan route:clear" fi if changed "yarn.lock$\|.js$\|.scss$"; then docker-compose run --rm -T node bash -c "yarn && yarn prod" fi if changed httpd.conf; then docker-compose up -d --force-recreate apache fi docker-compose restart worker exit 0
方案2:在docker-compose.yml中全局禁用对应服务的TTY分配
如果你不想修改每一行docker-compose run命令,可以直接在docker-compose.yml的worker、node等服务配置中添加tty: false,示例:
services: worker: # 原有其他配置不变 tty: false node: # 原有其他配置不变 tty: false
修改完成后,手动执行钩子和git pull触发钩子都不会再出现挂起问题。
内容的提问来源于stack exchange,提问作者G3z
相关产品推荐
相关产品推荐

