cloud init的runcmd执行bash脚本时GO111MODULE go install未执行原因
问题原因
- 环境变量不匹配
cloud init的runcmd执行时使用的是非交互、非登录的shell环境,不会加载用户目录下的.bashrc、.profile、.bash_profile等配置文件。如果你手动执行脚本时的go安装路径(比如/usr/local/go/bin、$GOPATH/bin)是写在上述用户级配置里的,runcmd执行时PATH环境变量里没有对应路径,会找不到go命令,导致该行执行失败,看起来就像未执行。 - 工作目录不匹配
你代码中go install使用的是相对路径. ./cmd/...,runcmd执行脚本时默认的工作目录是root用户的家目录/root,和你手动执行时的项目目录不一致,找不到对应go.mod文件或源码,执行直接报错。 - 执行用户不一致
runcmd默认以root用户执行脚本,如果你手动执行时用的是普通用户,root用户没有配置GOROOT、GOPATH等go必要环境变量,或者没有项目目录的读取权限,也会导致该行执行失败。 - 缺少错误日志导致误判
多数情况下该行不是未执行,而是执行报错后直接退出,你没有在脚本中配置错误日志输出,所以无法感知到报错信息。你可以在脚本开头添加set -eux,或者将该行输出重定向到日志文件排查:
GO111MODULE=on go install . ./cmd/... >> /var/log/myscript_go.log 2>&1
临时修复方案
你可以修改runcmd配置,先切换到项目目录,同时显式加载必要的环境变量:
runcmd: - [ bash, -c, "cd /path/to/your/project && source /root/.bashrc && bash /usr/local/bin/myscript.sh" ]
内容的提问来源于stack exchange,提问作者iFadi
相关产品推荐
相关产品推荐

