15

如果我composer install从我的主机运行,我会点击我的本地作曲家缓存:

  - Installing deft/iso3166-utility (1.0.0)
    Loading from cache

然而,当构建一个包含在其 Dockerfile 中的容器时:

RUN composer install -n -o --no-dev

我下载所有东西,例如:

  - Installing deft/iso3166-utility (1.0.0)
    Downloading: 100%         

这是意料之中的,但我喜欢避免它。即使在重建时,它也会再次下载所有内容。

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

我对此进行了调查,并找到了在 Dockerfile 中定义卷的方法

ENV COMPOSER_HOME=/var/composer
VOLUME /var/composer

我将它添加到我的Dockerfile,并希望只下载一次文件,然后点击缓存。

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

卷应该如何工作以在 docker 容器内拥有数据缓存?

4

3 回答 3

8

使用实验功能: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

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

export DOCKER_BUILDKIT=1
docker build ....

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

export COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1
docker-compose build ...

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

docker-compose version
于 2019-09-14T10:13:55.123 回答
4

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

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

    composer global require "hirak/prestissimo:^0.3"
    

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

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

    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
    

或将两者结合起来 =)

于 2016-11-25T11:41:02.720 回答
0

我会考虑使用该$HOME/.composer/cache/files目录。这是 composer 在使用 composer install 时读取/写入的地方。

如果您能够将它从您的主机安装到您的容器上,那将是可行的。您也可以在每次运行后将其 tar composer install,然后在composer install下次运行之前将其放入。

这就是 Travis CI 建议这样做的松散方式。

此外,请考虑在您的命令中使用--prefer-dist标志。composer install

可以在这里找到相关信息:https ://getcomposer.org/doc/03-cli.md#install

--prefer-dist:与--prefer-source 相反,如果可能,composer 将从 dist 安装。这可以大大加快构建服务器和其他通常不运行供应商更新的用例的安装速度。如果您没有正确的设置,这也是一种规避 git 问题的方法。

关于为您使用作曲家缓存的一些参考资料:

于 2019-01-15T19:56:27.783 回答