Docker重新构build时间

我们正在尝试为python应用程序创build一个Docker容器。 Dockerfile使用“pip install”来安装依赖关系。 Dockerfile看起来像

FROM ubuntu:latest RUN apt-get update -y RUN apt-get install -y git wget python3-pip RUN mkdir /app COPY . /app RUN pip3 install asn1crypto RUN pip3 install cffi==1.10.0 RUN pip3 install click==6.7 RUN pip3 install conda==4.3.16 RUN pip3 install Flask==0.12.2 RUN pip3 install Flask-SSLify==0.1.5 RUN pip3 install Flask-SSLify==0.1.5 RUN pip3 install flask-restful==0.3.6 WORKDIR /app ENTRYPOINT ["python3"] CMD [ "X.py", "/app/Y.yml" ] 

docker成功创build的问题是在重build时间。

  • 如果上面的dockerfile中没有任何更改
  • 如果在pip安装后的dockerfile中更改了一行,那么docker守护进程仍会运行pip install中的所有命令,下载所有的包但不安装它们。

有没有一种方法来优化重build?

谢谢

以下是我想要用Dockerfile进行优化的瞬间 –

 FROM ubuntu:latest RUN apt-get update -y && apt-get install -y \ git \ wget \ python3-pip \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY ./requirements.txt . RUN pip3 install -r requirements.txt COPY . /app ENTRYPOINT ["python3"] CMD [ "X.py", "/app/Y.yml" ] 
  • 特别是当它们相互依赖时,通过将多个命令集成到一个命令中来减less图层。 这有助于缩小图像大小。
  • 总是尝试最后使用COPY,因为常规的源代码更改可能会使下一层caching失效。
  • 通过pip使用单个的requirements.txt文件进行安装。 还要定义单独的步骤,以防万一你有大量的软件包要安装,不要让一个正常的源代码改变每个版本上的强制安装包。
  • 总是清理最终图像中不需要的中间事物。

Ref- https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/