【问题标题】:Docker and pip install: avoid installing all packages when some are already installedDocker 和 pip install:避免在已经安装了一些包的情况下安装所有包
【发布时间】:2019-08-09 16:28:45
【问题描述】:

我正在使用 docker compose 来构建 Python 项目的堆栈。这是处理需求的dockerfilesn-p。

# 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 需要创建一个新容器,但有没有办法避免重新安装所有内容而只安装必要的内容?

【问题讨论】:

标签: python docker pip docker-compose


【解决方案1】:

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

来自official docs,在Leverage 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 只会导致重新安装这些要求。

但是,作为警告,这也意味着更改 requirements1.txt 将完全需要重新安装 requirements2.txt,因为它是在 requirements1.txt 步骤之后进行的。这与一个文件的原始行为没有什么不同,但要知道这里的顺序很重要。这种流程还有其他一些缺点,但它们变得相当迂腐。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    相关资源
    最近更新 更多