You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:06:00