GitLab CI通过SSH部署时提示composer: command not found问题求助
问题原因
你遇到的报错本质是SSH远程执行命令时默认使用非交互非登录shell,不会加载用户家目录下的.bashrc、.profile等环境变量配置文件,而你服务器上的Composer路径大概率是写到了这些用户级配置的PATH变量里,没有加入全局环境变量,所以远程执行时系统找不到Composer命令。
你本地登录服务器、直接挂载Docker镜像运行都是用的登录/交互shell,会加载完整环境变量,所以可以正常执行。
解决方法
方案1(最快捷,优先推荐):使用Composer绝对路径执行
- 手动登录你的部署服务器,执行
which composer获取Composer的绝对路径,例如输出为/usr/local/bin/composer - 修改
.gitlab-ci.yml中script段的对应命令,替换为绝对路径即可:
script: - ssh ${DEPLOY_USER}@${DEPLOY_SERVER} "cd ${DEPLOY_DIR} && git pull origin main" # 把这里的composer替换为你实际查到的绝对路径 - ssh ${DEPLOY_USER}@${DEPLOY_SERVER} "cd ${DEPLOY_DIR} && /usr/local/bin/composer install --no-interaction --prefer-dist --optimize-autoloader"
方案2:强制SSH执行时加载登录shell
在远程执行的命令前加bash -l -c触发登录shell加载用户环境变量:
- ssh ${DEPLOY_USER}@${DEPLOY_SERVER} "cd ${DEPLOY_DIR} && bash -l -c 'composer install --no-interaction --prefer-dist --optimize-autoloader'"
方案3:全局配置Composer路径(需要服务器root权限)
编辑服务器的/etc/environment文件,把Composer所在的目录追加到PATH变量中,保存后所有用户、所有类型的shell都可以直接识别composer命令。
额外排查点
确认你CI配置中使用的${DEPLOY_USER}和你手动登录服务器测试的用户是同一个,避免出现不同用户环境变量配置不一致的问题。
内容的提问来源于stack exchange,提问作者patrick
相关产品推荐
相关产品推荐

