我正在按照本教程构建我的第一个Docker多阶段项目(以减小图像的大小):https://pythonspeed.com/articles/multi-stage-docker-python/。
我的dockerfile很简单:
RUN apt-get update
RUN apt-get -y --no-install-recommends install \
python3 python3-pip python3-venv
RUN python3 -m venv /opt/fwr
ENV PATH="/opt/fwr/bin:$PATH"
COPY requirements.txt .
RUN pip install -r requirements.txt
FROM python:3-alpine3.18 AS build-image
WORKDIR /opt/fwr
COPY --from=compile-image /opt/fwr /opt/fwr
COPY *.py ./
ENV PATH="/opt/fwr/bin:$PATH"
CMD ["-u", "main.py"]
ENTRYPOINT ["python"]
所有阶段都进展顺利,但一旦我尝试tu瑞恩容器我得到:
Traceback (most recent call last):
File "/opt/fwr/main.py", line 2, in <module>
import pandas as pd
ModuleNotFoundError: No module named 'pandas'
问题是:我做错了什么?谢谢!
1条答案
按热度按时间j9per5c41#
看起来您使用的基本映像与最终映像中的映像不同。您的Dockerfile如图所示是无效的-它缺少初始的
FROM
行-但看起来您可能正在使用Ubuntu变体。Ubuntu和大多数其他Linux发行版都是围绕glibc C库构建的。Alpine为了减小分布的大小,使用了musl libc。当你在Ubuntu下构建一些东西时,在Alpine下运行失败是很常见的,因为两个环境使用不同的动态加载器。
如果你使用相同的基础镜像来编译你在最终镜像中使用的东西,你会发现事情会按照预期的方式构建和运行:
注意:Pandas没有为Alpine提供二进制轮子,所以一切都需要从源代码构建。这可能需要很长时间。因为优化大小通常是一种浪费,如果你只使用标准Python镜像,你可以大大缩短构建时间:
由于我们在这里实际上没有编译任何东西,因此我们可以使用单个舞台图像。总的构建时间可能是一分钟(如果alpine构建不是仍在其他终端运行的话,可能会更快)。
更新
高山的建造终于完成了;最终的图像尺寸是:
您可能会想,“哇,基于Debian的映像要大得多!”,但在实践中,因为您经常会有许多从同一个基础构建的映像,所以真实的大小的影响是最小的。