Docker multi-stage ModuleNotFoundError

sulc1iza  于 2023-05-22  发布在  Docker
关注(0)|答案(1)|浏览(117)

我正在按照本教程构建我的第一个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'

问题是:我做错了什么?谢谢!

j9per5c4

j9per5c41#

看起来您使用的基本映像与最终映像中的映像不同。您的Dockerfile如图所示是无效的-它缺少初始的FROM行-但看起来您可能正在使用Ubuntu变体。
Ubuntu和大多数其他Linux发行版都是围绕glibc C库构建的。Alpine为了减小分布的大小,使用了musl libc。当你在Ubuntu下构建一些东西时,在Alpine下运行失败是很常见的,因为两个环境使用不同的动态加载器。
如果你使用相同的基础镜像来编译你在最终镜像中使用的东西,你会发现事情会按照预期的方式构建和运行:

FROM python:3-alpine3.18 AS compile-image

RUN apk add alpine-sdk gfortran
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"]

注意:Pandas没有为Alpine提供二进制轮子,所以一切都需要从源代码构建。这可能需要很长时间。因为优化大小通常是一种浪费,如果你只使用标准Python镜像,你可以大大缩短构建时间:

FROM python:3

RUN python3 -m venv /opt/fwr
WORKDIR /opt/fwr

ENV PATH="/opt/fwr/bin:$PATH"

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY *.py ./

ENV PATH="/opt/fwr/bin:$PATH"

CMD ["-u", "main.py"] 

ENTRYPOINT ["python"]

由于我们在这里实际上没有编译任何东西,因此我们可以使用单个舞台图像。总的构建时间可能是一分钟(如果alpine构建不是仍在其他终端运行的话,可能会更快)。

更新

高山的建造终于完成了;最终的图像尺寸是:

pytest-alpine   341 MB
pytest-debian   1.15 GB

您可能会想,“哇,基于Debian的映像要大得多!”,但在实践中,因为您经常会有许多从同一个基础构建的映像,所以真实的大小的影响是最小的。

相关问题