运行Docker容器提示找不到镜像内已复制脚本的问题求助
问题排查结果
核心报错原因
- 直接触发找不到文件的原因是CMD指令中脚本路径写法错误:你通过COPY指令将脚本放到了容器内的绝对路径
/home/$USER_NAME/yocto/input/下,但CMD里写的路径是./home/$USER_NAME/yocto/input/prep.sh,前缀带的./表示相对当前工作目录(即你通过WORKDIR指定的$BUILD_OUTPUT_DIR)查找路径,该目录下不存在home/rtr2460/yocto/input/prep.sh的层级结构,因此抛出文件不存在错误。 - 额外潜在风险:Azure Pipelines任务中的docker run镜像地址存在域名重复问题,当前写法为
2460testacr.azurecr.io/2460testacr.2460testacr.azurecr.io:$(tag),不符合ACR镜像的标准命名格式,可能导致拉取到旧版本镜像、镜像拉取失败等问题。
构建阶段RUN ls -l /home/$USER_NAME/yocto/input/*.sh能正常列出文件,是因为该命令使用了绝对路径查找,和启动时的相对路径错误不冲突。
修复方案
- 修改Dockerfile中的CMD指令,去掉路径前多余的
./前缀,使用绝对路径调用脚本:
# 修正后的CMD配置,sh -c会自动展开路径中的环境变量 CMD ["sh","-c", "/home/$USER_NAME/yocto/input/prep.sh && bitbake $PROJECT"]
- 修正Azure Pipelines中docker run的镜像地址,删除重复的ACR域名段,标准格式参考:
- task: Docker@2 inputs: containerRegistry: '2460-ACR-connection-TMM' command: 'login' - script: | # 镜像格式为<ACR服务地址>/<仓库名>:<标签>,按实际仓库名替换<your-repo>即可 docker run 2460testacr.azurecr.io/<your-repo>:$(tag)
- 推送镜像前可本地做前置验证:
- 构建本地镜像后执行
docker run --entrypoint sh <本地镜像名:标签>进入容器交互终端 - 执行
ls -l /home/$USER_NAME/yocto/input/prep.sh确认文件存在 - 直接执行绝对路径脚本确认无路径错误后再推送至ACR
- 构建本地镜像后执行
内容的提问来源于stack exchange,提问作者RetiZi
相关产品推荐
相关产品推荐

