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容器中拥有数据缓存?
使用实验功能: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)
我找到了两种处理这个问题的方法,但没有一种方法可以再处理作曲家卷。
别作曲家下载过程:使用hirak/prestissimo
composer global require "hirak/prestissimo:^0.3"
Run Code Online (Sandbox Code Playgroud)
使用 Composer 2.0,不再需要上述步骤即可实现更快的下载。事实上,它不会安装在 Composer 2.0 环境中。
强制 docker 使用缓存的 Composer 安装。如果添加的文件没有改变,
Docker 会使用缓存。RUN如果您只这样做COPY . /your-php-app,docker 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)
或将两者结合起来 =)
| 归档时间: |
|
| 查看次数: |
4752 次 |
| 最近记录: |