2016-08-18 80 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 
    

或將二者結合起來=)