如何缓存docker版本的包管理器下载?

k0p*_*kus 5 caching composer-php docker diskcache docker-volume

如果我composer install从我的主机运行,我会点击我的本地编写器缓存:

  - Installing deft/iso3166-utility (1.0.0)
    Loading from cache
Run Code Online (Sandbox Code Playgroud)

然而,当在Dockerfile中构建一个容器时:

RUN composer install -n -o --no-dev
Run Code Online (Sandbox Code Playgroud)

我下载了所有的东西,例如:

  - Installing deft/iso3166-utility (1.0.0)
    Downloading: 100%         
Run Code Online (Sandbox Code Playgroud)

这是预期的,但我喜欢避免它.即使在重建时,它也会再次下载所有内容.

我想为作曲家提供一个通用缓存,我也可以为其他docker项目转发.

我查看了这个并找到了在Dockerfile中定义卷的方法:

ENV COMPOSER_HOME=/var/composer
VOLUME /var/composer
Run Code Online (Sandbox Code Playgroud)

我把它添加到我的Dockerfile,并且预计只下载一次文件,然后点击缓存.

然而,当我修改我的composer,例如删除-o标志,并重新运行时docker build .,我希望在构建时达到缓存,但我仍然会再次下载供应商.

卷如何在docker容器中拥有数据缓存?

Abd*_*UMI 7

使用实验功能:Docker buildkit(从docker 18.09 开始支持,docker-compose 1.25.4)

在您的 dockerfile 中

# syntax=docker/dockerfile:experimental
FROM ....
# ......  
RUN --mount=type=cache,target=/var/composer composer install -n -o --no-dev
Run Code Online (Sandbox Code Playgroud)

现在在构建之前,请确保已导出 env var:

export DOCKER_BUILDKIT=1
docker build ....
Run Code Online (Sandbox Code Playgroud)

如果您正在使用 docker-compose,请确保也导出COMPOSE_DOCKER_CLI_BUILD

export COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1
docker-compose build ...
Run Code Online (Sandbox Code Playgroud)

如果它不适用于 docker-compose,请确保您的 docker-compose 版本高于 1.25.4

docker-compose version
Run Code Online (Sandbox Code Playgroud)

  • 18.09 ..我会将其添加到答案中 (2认同)
  • 除了导出 var 之外,还可以将其包含在命令本身中:“DOCKER_BUILDKIT=1 docker build”。 (2认同)

k0p*_*kus 4

我找到了两种处理这个问题的方法,但没有一种方法可以再处理作曲家卷。

  1. 别作曲家下载过程:使用hirak/prestissimo

    composer global require "hirak/prestissimo:^0.3"
    
    Run Code Online (Sandbox Code Playgroud)

使用 Composer 2.0,不再需要上述步骤即可实现更快的下载。事实上,它不会安装在 Composer 2.0 环境中。

  1. 强制 docker 使用缓存的 Composer 安装。如果添加的文件没有改变,
    Docker 会使用缓存。RUN如果您只这样做COPY . /your-php-appdocker build即使源树中只有一个不相关的文件发生了变化,也会刷新所有现金并重新运行composer install。
    为了使 docker build 运行composer install 仅在包更改时安装,必须在添加源文件之前添加composer.json并归档。composer.lock由于无论如何也需要源文件,因此必须使用不同的文件夹进行 Composer 安装并将内容同步回然后添加的文件夹;此外,还必须手动运行安装后脚本。
    它应该看起来像这样(未经测试):

    WORKDIR /tmp/
    COPY composer.json composer.lock ./
    RUN composer install -n -o --no-dev --no-scripts
    
    WORKDIR /your-php-app/ 
    COPY . /your-php-app/
    RUN rsync -ah /tmp/* /your/php-app/
    RUN composer run-script post-install-cmd
    
    Run Code Online (Sandbox Code Playgroud)

或将两者结合起来 =)