AWS SageMaker中复制Python脚本到Docker容器报错求助
Docker复制脚本报错排查方案
核心问题几乎都是Docker build上下文与COPY指令路径不匹配,和SageMaker环境本身无关,按以下步骤逐一定位即可:
先搞懂build上下文的基础规则
- Docker执行
COPY/ADD指令时,只能访问build上下文范围内的文件,上下文是你执行docker build命令最后传入的路径,和Dockerfile本身存放在哪个文件夹没有必然联系。 - 举个典型错误示例:你的目录结构是
项目根目录/src/train_sm.py、项目根目录/docker/Dockerfile,如果你在项目根目录执行docker build -f docker/Dockerfile .,此时上下文是项目根目录,Dockerfile里写COPY train_sm.py /opt/ml/code/必然报错,正确写法是COPY src/train_sm.py /opt/ml/code/。 - 如果你是切到docker文件夹下执行
docker build -t img .,此时上下文是docker文件夹,就算你把train_sm.py移到了docker文件夹里,也要确认:- COPY指令写的源文件名和实际文件名完全一致(SageMaker底层是Linux环境,严格区分大小写,注意不要有隐藏后缀比如
train_sm.py.txt) - 执行build的用户对脚本文件有读权限
- COPY指令写的源文件名和实际文件名完全一致(SageMaker底层是Linux环境,严格区分大小写,注意不要有隐藏后缀比如
快速定位技巧
- 不要靠记忆猜路径,先在SageMaker Notebook单元格执行
!pwd确认当前工作路径,再执行!ls -R打印全目录结构,和你写的COPY路径逐字符比对。 - 临时在Dockerfile的COPY指令前加两行调试代码:
重新执行build,看日志里打印的上下文文件列表,直接找train_sm.py的实际路径,照着日志里的路径改COPY的源参数即可,10分钟内就能定位路径问题。COPY . /tmp/debug_ctx RUN ls -R /tmp/debug_ctx - 检查上下文根目录下的
.dockerignore文件,确认没有配置规则把.py文件、src目录或者docker目录排除在构建上下文外。
移动文件到docker文件夹仍报错的常见原因
- 移动文件后没有切换build命令的上下文路径,还是用了之前指向项目根目录的上下文参数,自然找不到移到docker文件夹里的脚本。
- 移动文件后COPY指令的路径没同步改,比如上下文已经是docker文件夹、脚本就在docker文件夹根下,还保留着之前写的
COPY src/train_sm.py .配置。
最快验证方案:先把Dockerfile移到项目根目录,和src文件夹同级,在项目根目录执行
docker build -t test-img .,Dockerfile里写COPY src/train_sm.py /目标路径/,这个配置没有路径嵌套问题,绝大多数场景下能直接构建成功,后续再按需调整目录结构即可。
内容的提问来源于stack exchange,提问作者stackword_0
相关产品推荐
相关产品推荐

