Docker部署Azure DevOps代理启动报错./start.sh不存在排查
Azure DevOps容器代理启动报
exec ./start.sh: no such file or directory排查方案 这个报错在Docker容器启动场景下,绝大多数情况不是文件未复制进镜像,而是文件格式、路径配置、解释器配置的隐性问题,按以下优先级从高到低排查即可:
- 第一优先级:排查脚本换行符格式问题
如果你在Windows环境下编写start.sh,文件默认会使用CRLF(\r\n)换行格式,而Linux系统仅识别LF(\n)换行。此时脚本第一行的解释器声明(shebang)会被拼接上多余的回车符,被系统识别为无效的解释器路径,直接抛出“找不到文件”的错误,和你描述的现象完全匹配。
排查修复方式:- 本地编辑时直接切换换行格式:用VS Code打开
start.sh,点击右下角状态栏的CRLF标识,切换为LF后保存重新构建镜像即可 - 不想改本地文件的话,可以直接在Dockerfile中增加格式转换步骤:安装
dos2unix工具,在复制脚本后执行dos2unix ./start.sh自动转换格式 - 临时验证可以启动调试容器进入镜像内部:执行
docker run --rm -it --entrypoint bash dockeragent:latest进入容器后,先执行ls -l /azp/start.sh确认文件存在,再执行cat -v /azp/start.sh,如果每行末尾出现^M标识,就可以确定是换行符问题。
- 本地编辑时直接切换换行格式:用VS Code打开
- 第二优先级:排查脚本解释器声明错误
检查start.sh第一行的解释器声明,ubuntu:20.04镜像内bash的默认路径是/bin/bash,如果声明写成了#!/usr/bin/bash、带不存在的执行参数,或者路径拼写错误,也会触发同类报错。直接把第一行修改为标准的#!/bin/bash即可。 - 第三优先级:排查Dockerfile指令顺序问题
确认Dockerfile中WORKDIR /azp指令的位置,如果是先执行COPY start.sh .再设置工作目录,start.sh会被复制到镜像根目录而非/azp路径下,ENTRYPOINT执行相对路径./start.sh时自然找不到文件。调整指令顺序,保证先设置工作目录,再执行文件复制、权限配置步骤即可。 - 第四优先级:排查执行权限链路问题
如果你参照文档创建了非root的运行用户(比如azp用户),需要确认chmod +x start.sh步骤是在切换运行用户之前执行,或者显式给运行用户授予脚本的读+执行权限,避免因为权限不足被系统误报为文件不存在。权限配置可以参考指令:chmod 755 ./start.sh && chown azp:azp ./start.sh。
内容的提问来源于stack exchange,提问作者Jonathon Ford
相关产品推荐
相关产品推荐

