我的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 .
被用在开发机器上,而从未在生产中使用。
答案 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映像的过程。从轮子安装只需几毫秒,而从源代码安装则需要数十秒。
我不知道它是否会对您有所帮助,但至少这是一个开始,您可以根据自己的需要进行更改。