在复制整个项目之前安装setup.py依赖项

时间:2018-08-05 18:26:29

标签: python docker pip

我的Dockerfile曾经是这样的:

...
COPY . /source/
RUN pip install -e .
...

但是,我想通过在复制其余代码之前只进行COPY的{​​{1}}来减少完成docker构建所需的时间。这样可以在两次安装之间进行pip安装,因此不需要每次代码更改时都进行安装,只有在setup.py进行时才需要安装。

setup.py

您是否发现在生产docker映像中使用... COPY setup.py /source/ RUN pip install -e . COPY . /source/ ... 有效率方面的问题?有更好的方法吗?我想知道,因为我只看到pip install -e .被用在开发机器上,而从未在生产中使用。

1 个答案:

答案 0 :(得分:0)

为什么要在生产环境中使用var output = Regex.Replace(input, "[0-9]*.[0-9]* €", ""); 而不是pip install -e .进行安装?如果您希望能够在不重新启动容器的情况下修改代码,那么只能在开发中做到这一点。在生产中,更安全的做法是仅在容器重启后才允许更改代码。

关于构建图像的方式,如果要加快构建速度并获得清晰的最终图像,可以尝试进行多阶段构建:

在第一阶段中使用多阶段构建为每个依赖项创建轮子,并在第二步中安装软件包和依赖项。

pip install .

这样,最终容器上不会安装任何依赖项。

此外,如果您不更改自己的FROM python:3-alpine as wheels_builder RUN mkdir /wheels COPY setup.py ./setup.py # Filter the packages not needed to build your sources RUN apk add --update --no-cache gcc g++ gfortran openblas-dev musl-dev linux-headers libffi-dev openssl-dev sqlite-dev tk-dev readline-dev ncurses-dev RUN pip install -U pip wheel setuptools && pip wheel . --wheel-dir=/wheels # Second step of build FROM python:3-alpine as prod COPY --from=base /wheels /tmp/wheels COPY . /source RUN pip install --no-index --find-links=/tmp/wheels/. . 文件,我认为docker将使用缓存,并且您不必重建wheels_builder映像。

它应该加快为您的项目重新创建docker映像的过程。从轮子安装只需几毫秒,而从源代码安装则需要数十秒。

我不知道它是否会对您有所帮助,但至少这是一个开始,您可以根据自己的需要进行更改。