GitLab Runner提示‘command not found’但已使用正确Docker镜像求助
咱们来搞定你在GitLab CI里用fstab/aws-cli镜像执行aws命令时出现的「command not found」问题,下面是几个最可能解决问题的办法:
1. 检查镜像的entrypoint是否在干扰执行
很多Docker镜像会设置自定义的entrypoint,这会导致在GitLab CI的script里直接运行命令时出问题。试试把entrypoint设为空字符串,让shell能正确识别aws命令:
master: type: deploy environment: master image: fstab/aws-cli entrypoint: "" # 加这一行绕过镜像默认的entrypoint script: - aws s3 sync . s3://aws-website-xxxxxxx --exclude ".git/*" --exclude ".vscode/*" --exclude ".DS_Store/*" --exclude ".DS_Store" --cache-control "max-age=120000" --delete only: - master # 把原来的"..."换成你实际的目标分支,比如master
2. 调试定位aws命令的路径
如果覆盖entrypoint没用,咱们先确认aws二进制文件在镜像里的位置。在script里加几个诊断命令来找它:
script: - # 检查aws是否在系统PATH中 - which aws || echo "aws不在PATH路径中" - # 搜索整个镜像文件系统找aws二进制文件 - find / -name aws -type f 2>/dev/null - # 用find结果里的绝对路径来运行同步命令 - /找到的绝对路径/aws s3 sync . s3://aws-website-xxxxxxx --exclude ".git/*" --exclude ".vscode/*" --exclude ".DS_Store/*" --exclude ".DS_Store" --cache-control "max-age=120000" --delete
3. 改用官方AWS CLI镜像
fstab/aws-cli镜像可能存在过时或非标准配置的问题,亚马逊官方的AWS CLI镜像维护更积极,路径和执行逻辑的问题更少:
master: type: deploy environment: master image: amazon/aws-cli:latest # 替换为官方镜像 script: - aws s3 sync . s3://aws-website-xxxxxxx --exclude ".git/*" --exclude ".vscode/*" --exclude ".DS_Store/*" --exclude ".DS_Store" --cache-control "max-age=120000" --delete only: - master
4. 确认GitLab Runner的执行器配置
再检查一下你的GitLab Runner是不是用的docker执行器(不是shell或其他类型)。如果用的是shell执行器,它会尝试在Runner主机上运行aws,而不是在指定的Docker镜像里,若主机未安装aws就会报命令找不到的错误。
另外也要确认你的AWS凭证变量(AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY)已经正确添加到项目的设置 > CI/CD > 变量中,若变量标记为「受保护」,则你的目标分支也需要是受保护分支才能正常调用。
内容的提问来源于stack exchange,提问作者Vignesh PT
相关产品推荐
相关产品推荐

