如何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的音量。
-
紧固composer php下载过程:使用hirak / prestissimo
composer global require "hirak/prestissimo:^0.3"
-
强制docker使用caching的composer php安装。
如果添加的文件没有改变,Docker在RUN
上使用一个caching。 如果你只做COPY . /your-php-app
COPY . /your-php-app
,即使源树中只有一个不相关的文件发生了变化,docker build
也会刷新所有钱币并重新运行composer install。
为了使docker构build运行composer php安装只安装包改变,必须添加composer.json
和composer.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
或者结合这两个=)