Docker和pip安装:避免在已安装某些软件包的情况下安装所有软件包

时间:2019-03-19 08:00:43

标签: python docker pip docker-compose

我正在使用docker compose来构建Python项目的堆栈。这是一个满足要求的dockerfile代码段。

# Requirements are installed here to ensure they will be cached.
COPY ./requirements /requirements
RUN pip install --no-cache-dir -r /requirements/production.txt \
    && rm -rf /requirements

使用该配置,我可以缓存需求,但是当我修改production.txt(例如,甚至更新单个软件包)时,Docker会重新安装所有内容。

我知道Docker需要创建一个新的容器,但是有一种方法可以避免再次重新安装所有内容,而仅安装必要的内容?

1 个答案:

答案 0 :(得分:0)

在这种情况下,不能,没有办法避免重新安装production.txt中的所有内容。

official docsLeverage build cache部分开始:

  

对于ADD和COPY指令,文件中的内容   检查图像并为每个文件计算校验和。的   文件的上次修改时间和上次访问时间不是   在这些校验和中考虑。在缓存查找期间,校验和   与现有图像中的校验和进行比较。如果有什么   已更改文件(例如内容和元数据),然后   缓存无效

production.txt更改以来,缓存无效,并且docker从先前有效的层启动并安装了所有内容。

现在,如果您有多个requirements.txt文件,则可以通过执行复制和安装的单独步骤来利用某些缓存:

COPY requirements1.txt
RUN pip install --no-cache-dir -r requirements1.txt

COPY requirements2.txt
RUN pip install --no-cache-dir -r requirements2.txt

这可能还有其他弊端,但是它可能会通过将不太可能在requirements1.txt中更新而不太稳定的软件包放在requirements2.txt中的长期有效软件包中来部分减少重新安装时间。更改requirements2.txt只会导致重新安装这些要求。