Python 3.x 在dockerfile中缓存PIP包

Python 3.x 在dockerfile中缓存PIP包,python-3.x,docker,pip,docker-compose,dockerfile,Python 3.x,Docker,Pip,Docker Compose,Dockerfile,我正在尝试为我的python项目设置docker,该项目使用虚拟环境,并在requirements.txt中定义了一些依赖项 我还安装了docker compose,它使用Dockerfile命令docker compose up--build 我的Dockerfile: FROM ubuntu:16.04 FROM python:3.5 MAINTAINER **** ADD . /core-proejct WORKDIR /core-project RUN pip3 instal

我正在尝试为我的python项目设置docker,该项目使用虚拟环境,并在
requirements.txt
中定义了一些依赖项

我还安装了
docker compose
,它使用
Dockerfile
命令
docker compose up--build

我的Dockerfile:

FROM ubuntu:16.04
 FROM python:3.5  
MAINTAINER ****  

ADD . /core-proejct
WORKDIR /core-project
RUN pip3 install virtualenv
RUN . /bin/activate
RUN pip install -r requirements.txt
因此,每当我试图构建映像时,它都会从
requirements.txt
安装所有pip模块


是否有任何方法可以缓存pip模块并在构建映像时使用缓存版本。

首先,dockerfile中ubuntu:16.04的
是多余的,因为单个映像只能有一个上游映像

解决问题的简单方法是在添加项目之前将
pip
命令移动到,这样更改项目不会使整个缓存失效

最后,您真的不需要在容器中使用virtualenv,否则您将无法使用它

例如:


ADD将遇到更少的问题我听到过关于在容器中使用virtualenv的各种不同意见。尽管无可争议的是,每个容器在理想情况下都应该有一个单一的用途,但有很多人选择使用virtualenv进一步分离应用程序依赖项和操作系统依赖项,即使在docker容器中也是如此。请注意,当使用COPY而不是docker容器时,这不起作用ADD@VME我的观察并不能证实这一点<代码>复制
工作得相当好,而且更可取,因为它有一个更窄的用例(没有URL源,没有存档解包)。
FROM python:3.5

# MAINTAINER is deprecated. Use LABEL instead.
LABEL maintainer "your info here"

WORKDIR /core-project

ADD ./requirements.txt .
RUN pip install -r requirements.txt

# Add everything else now.
ADD . .