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
相关产品推荐
相关产品推荐

