Docker容器内已复制abs.exe仍报FileNotFoundError问题求助
问题核心原因
- 跨平台程序不兼容
你本地是Windows环境,所以abs.exe和配套.dll文件可以正常运行,但你使用的python:3.7是Linux系统基础镜像,无法识别Windows格式的可执行文件和动态库,这是最核心的错误原因。 - 可执行文件查找规则不匹配
Linux系统默认只会从PATH环境变量配置的路径中查找可执行文件,不会优先读取当前工作目录的文件。就算你放入的是Linux版本的abs,直接写abs也会提示找不到,需要写成./abs的相对路径格式,同时还要给文件添加可执行权限。 - subprocess参数传递错误
你将-n 100、-c 10合并为单个字符串传递,subprocess会将其识别为一个完整的参数,导致程序无法正确解析参数。
修复方案
最简单的方式是直接在容器内安装Linux版本的Apache Bench,不需要自己拷贝二进制文件,修改Dockerfile如下:
FROM python:3.7 # 安装系统自带的Apache Bench(默认支持SSL) RUN apt update && apt install -y apache2-utils && rm -rf /var/lib/apt/lists/* COPY requirements.txt / RUN pip install -r /requirements.txt COPY ./ /app WORKDIR /app CMD [ "python", "ab_script.py"]
然后修改ab_script.py中的subprocess调用代码,拆分参数:
subprocess.Popen(['abs', '-n', '100', '-c', '10', 'https://my-url.com'], stdout=subprocess.PIPE, universal_newlines=True)
如果你坚持使用自行编译的abs,需要换成Linux平台编译的二进制文件,放入/app目录后,在Dockerfile中新增一行RUN chmod +x /app/abs赋予执行权限,同时将subprocess的第一个参数改为./abs。
内容的提问来源于stack exchange,提问作者Vishnukk
相关产品推荐
相关产品推荐

