2016-08-18 87 views
3

如果我从我的主机上运行composer install,我打我的本地作曲家缓存:如何缓存docker build的软件包管理器下载?

- 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%   

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

我想有一个作曲家的通用缓存,我也可以转发其他码头项目。

我看着这一点,并找到了办法define a volume in the Dockerfile

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

我还说,我Dockerfile,并预计将只有一次下载的文件,事后命中缓存。

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

卷应该如何在Docker容器中有数据缓存?

+0

体积将持续一个容器实例,但不是在构建。您可以创建一个指定的卷,它将保留在一个静态位置,但您将一个解决方案耦合到一个环境。你需要考虑在构建vs之后你想要做什么。您可以设置某种本地存储库来充当缓存/代理。 – ldg

+0

我也很苦恼。你有没有想出一个办法呢?我想也许使用HTTP代理并指导Docker使用它可以工作。可能排除hub.docker。com从代理到不保留下载图像的两个副本。 – gooli

+0

@gooli发表了一个关于我如何处理这个问题的答案。 Thx提醒。 – k0pernikus

回答

1

我发现了处理这个问题的两种方法,但没有一个处理作曲家卷了。

  1. 法尔胜作曲家下载过程:使用hirak/prestissimo

    composer global require "hirak/prestissimo:^0.3" 
    
  2. 力泊坞窗使用缓存的作曲家安装。
    如果添加的文件没有更改,Docker将使用RUN上的缓存。如果仅使用COPY . /your-php-app,docker build将刷新所有兑换卡并重新运行作曲家安装,即使源树中只有一个不相关的文件发生更改。
    为了使码头构建运行作曲家安装只安装在包更改上,必须在添加源文件之前添加composer.jsoncomposer.lock文件。由于无论如何还需要源文件,因此必须使用不同的文件夹进行作曲者安装并将rsync内容返回到随后添加的文件夹;此外还需要手动运行安装后脚本。
    它应该是这个样子(未经测试):

    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 
    

或将二者结合起来=)