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

PhpStorm或本地环境Git post-checkout结合Docker运行命令报错求助

问题根源

你现有脚本的逻辑错误为:docker exec -i php_web /bin/sh 仅会启动一个运行在容器内的shell进程,后续编写的echo、php命令仍然归属宿主机脚本的执行上下文,并不会自动传入容器内运行。因此本地执行的PHP进程无法解析Docker内部的MySQL服务域名,才会抛出getaddrinfo failed的连接报错。

修正方案

提供两种常用写法,按需选择即可:

方案1:单命令直接传入

仅需要执行少量容器内命令时推荐该写法,结构最简洁:

#!/bin/bash

echo $$ # 输出宿主机当前进程ID

echo -e "*********************************"
echo -e "*********GENERATE-PROXIES********"
echo -e "*********************************"

# 所有需要在容器内执行的命令都通过/bin/sh -c 参数传入
# 请将下方的「/容器内项目根路径」替换为你php_web容器中项目代码的实际挂载路径,比如 /project
docker exec -i php_web /bin/sh -c "cd /容器内项目根路径 && php bin/console orm:generate-proxies"

方案2:多命令批量传入

需要在容器内执行多段命令时推荐用HereDoc写法,可读性更高:

#!/bin/bash

echo $$ # 输出宿主机当前进程ID

echo -e "*********************************"
echo -e "*********GENERATE-PROXIES********"
echo -e "*********************************"

docker exec -i php_web /bin/sh <<'EOF'
# 此处所有命令都会在php_web容器内执行
cd /容器内项目根路径
php bin/console orm:generate-proxies
# 其他需要在容器内执行的命令可以继续往下写
EOF

注意:不要给docker exec添加-t参数,Git钩子属于非交互式执行场景,分配伪终端会触发the input device is not a TTY报错。

验证方法

修改完成后先手动执行脚本验证可用性:

# 确保钩子有可执行权限
chmod +x .git/hooks/post-checkout
# 手动触发执行
./.git/hooks/post-checkout

执行无数据库连接报错、代理文件正常生成即配置生效。

内容的提问来源于stack exchange,提问作者AdiOverRide

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:27:04