如何cachingdocker构build的包pipe理器下载?

如果我从我的主机运行composer install ,我打我的本地composer phpcaching:

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

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

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

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

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

这是预期的,但我喜欢避免它。 即使重build,它也会下载一切。

我想有一个composer php的通用caching,我也可以转发其他docker项目。

我看着这个,find了在Dockerfile中定义一个卷的方法 :

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

我将其添加到我的Dockerfile ,预计只下载一次这些文件,然后点击caching。

然而,当我修改我的composer ,例如删除-o标志,并重新运行docker build . ,我预计会打上caching,但我仍然下载供应商。

卷应该如何在Docker容器中有一个数据caching?

我发现了两种处理这个问题的方法,但是没有一个处理composer php的音量。

  1. 紧固composer php下载过程:使用hirak / prestissimo

     composer global require "hirak/prestissimo:^0.3" 
  2. 强制docker使用caching的composer php安装。
    如果添加的文件没有改变,Docker在RUN上使用一个caching。 如果你只做COPY . /your-php-app COPY . /your-php-app ,即使源树中只有一个不相关的文件发生了变化, docker build也会刷新所有钱币并重新运行composer install。
    为了使docker构build运行composer php安装只安装包改变,必须添加composer.jsoncomposer.lock文件,然后添加源文件。 由于无论如何也需要源文件,因此必须使用不同的文件夹进行作曲者安装,并将内容反馈到随后添加的文件夹; 此外还需要手动运行安装后的脚本。
    它应该看起来像这样(未经testing):

     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 

或者结合这两个=)