Docker运行容器报错OCI runtime create failed找不到split_csv.py排查
报错根因
- 启动命令参数逻辑错误:
docker run <镜像名> 后续内容的语法中,镜像名后的所有字段会完全覆盖Dockerfile中定义的CMD指令,作为容器的1号进程直接执行。你写的启动命令会让容器直接查找系统$PATH下名为split_csv.py的可执行文件运行,而不是调用python解释器执行该脚本——该脚本本身不是注册到PATH的可执行程序,自然触发找不到文件的报错。 - Dockerfile路径配置错误:你通过
WORKDIR /docker_task2设置了容器内的工作目录后,后续所有相对路径都会基于该目录解析。你写的COPY split_csv.py ./docker_task2实际会把脚本复制到/docker_task2/docker_task2/split_csv.py,而非工作目录根路径,就算命令写对也会找不到脚本。另外你注释掉的ENTRYPOINT写法不符合exec格式要求,数组的每个元素必须是单独的字符串,不能把整段命令塞到一个数组项里。
修复步骤
- 修正Dockerfile配置
删除冗余的复制指令,修正文件复制路径,调整ENTRYPOINT和CMD的写法,固定python解释器为执行入口,默认参数放在CMD中方便自定义覆盖,修正后的内容如下:
FROM python:latest WORKDIR /docker_task2 ENV PORT 80 # WORKDIR已指向/docker_task2,直接复制文件到当前目录即可 COPY split_csv.py . COPY test_data.csv . # 固定执行入口为python调用目标脚本 ENTRYPOINT ["python", "split_csv.py"] # 配置默认运行参数,启动时传参可直接覆盖 CMD ["-i", "test_data.csv", "-o", "test_data.csv", "-r", "100"]
- 重新构建镜像
在Dockerfile所在目录执行构建命令:docker build -t splitter . - 调整启动命令
镜像名后不需要再写脚本名,直接传入需要的参数即可,如果使用默认参数甚至可以省略后续参数:
# 自定义参数启动 docker run splitter -i test_data.csv -o test_data.csv -r 100 # 使用默认参数直接启动 docker run splitter
补充说明:如果需要直接运行
split_csv.py而非通过python显式调用,需要在脚本首行添加shebang声明#!/usr/bin/env python,构建时给脚本加可执行权限,同时将脚本放到$PATH包含的目录下,对于普通python脚本场景,显式调用解释器的方式更简单稳定,不需要额外配置。
内容的提问来源于stack exchange,提问作者Arinze
相关产品推荐
相关产品推荐

