Docker多阶段构建Python3镜像报错:文件未找到问题咨询
解决Docker多阶段构建Python镜像的报错问题
首先,咱们先搞清楚你为啥会遇到这个错误:
报错原因分析
你在base阶段用apt-get install python3安装的Python,在Ubuntu 18.04里的实际路径是/usr/bin/python3,而不是你复制的/usr/local/bin/目录。这就导致release阶段的镜像里根本没有Python解释器,当你运行./test.py时,系统找不到执行脚本所需的Python,自然就抛出了no such file or directory的错误。
至于你说在release阶段重新安装Python就能运行,那是因为这次安装补上了缺失的解释器,但这确实违背了多阶段构建的初衷。
多阶段构建到底有啥用?
它的核心价值是分离「构建环境」和「运行环境」,从而大幅减小最终镜像的体积,同时避免把构建过程中的冗余依赖带到生产环境里:
- 比如如果你的Python项目需要编译C扩展(像一些科学计算库),就得安装
gcc、make这类构建工具,这些工具在运行时完全没用; - 再比如用
pip安装依赖时,构建阶段可能会留下缓存文件,多阶段构建可以只复制安装好的依赖包,丢掉缓存。
你现在的场景比较简单,只是安装Python,所以看起来好像重复,但复杂场景下它的优势就很明显了。
给你几个正确的Dockerfile写法
写法一:纠正Python路径的复制
FROM ubuntu:18.04 as base RUN apt-get -qy update && apt-get install python3 -y WORKDIR /pydocktest COPY test.py . FROM ubuntu:18.04 AS release WORKDIR /pytest # 复制正确的Python可执行文件路径 COPY --from=base /usr/bin/python3 /usr/bin/python3 # 复制项目代码 COPY --from=base /pydocktest . # 直接用Python解释器运行脚本,比依赖shebang更稳妥 CMD ["python3", "./test.py"]
写法二:用轻量Python镜像优化体积
如果你的项目不需要Ubuntu的完整环境,推荐用官方的轻量Python镜像,能进一步缩小镜像:
# 构建阶段:安装依赖(如果有requirements.txt的话) FROM python:3.8-slim as base WORKDIR /pydocktest COPY requirements.txt . # --no-cache-dir避免留下pip缓存,减小镜像体积 RUN pip install --no-cache-dir -r requirements.txt COPY test.py . # 运行阶段:只复制必要的依赖和代码 FROM python:3.8-slim AS release WORKDIR /pytest # 复制安装好的Python依赖包 COPY --from=base /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages # 复制项目代码 COPY --from=base /pydocktest . CMD ["python3", "./test.py"]
额外小提示
如果坚持用./test.py直接运行,需要满足两个条件:
- 在
test.py的开头加上shebang:#!/usr/bin/env python3 - 在
base阶段给脚本添加执行权限:RUN chmod +x test.py
不过还是推荐直接用python3 ./test.py的方式运行,兼容性更好。
内容的提问来源于stack exchange,提问作者zewOlF
相关产品推荐
相关产品推荐

