Docker 在使用層進行緩存方面做得很好。每個命令(例如,RUN、ADD 等)都會生成一個層,Docker 會在未來的構建中重用該層,除非發生某些變化。與往常一樣,這個過程也有例外,但一般來說這是正確的。另一種類型的緩存是針對容器內的特定操作(例如編譯源代碼)進行緩存。
在 Screenly,我們在 Docker 容器內創建了一個 Qt 構建環境。我們創建此 Qt 構建是為了確保構建過程可重現并易于在開發人員之間共享。由于 Qt 編譯過程需要很長時間,我們利用ccache來加速我們的 Qt 編譯。實施 ccache 需要從 Docker 環境外部卷安裝文件夾。
如果您是該項目的唯一開發人員,則上述步驟很有效。如果您希望能夠在團隊中共享緩存,會發生什么情況?
有幾種方法可以在 Docker 中實現這種緩存方式。
建立共享緩存的最簡單方法是按照我們在上一篇文章中所做的操作。我們使用磁盤緩存以及一些簡潔的功能來加速 BuildKit 中的緩存。然后我們壓縮緩存文件并將它們分發給團隊成員。這個過程不是很優雅,但它完成了工作。
如果我們想進一步自動化該過程,我們可以將檢索緩存作為構建過程的一部分。這方面的一個例子可能是這樣的:
RUN curl -o /tmp/build-cache.tgz https://some-domain.com/build-cache.tgz && /
tar xfz /tmp/build-cache.tgz -C /tmp && /
rm /tmp/build-cache.tgz
上面的過程很簡潔,但這確實意味著有人需要定期上傳構建緩存以保持緩存文件最新。此外,您需要在某個地方存儲文件(例如 S3)。
如果我們可以避免手動任務并使用原生 Docker 技術來做同樣的事情,那就太好了,對吧?事實證明,我們可以使用 Docker 來改進流程。我們只需要發揮我們的想象力。
正如我們在上一篇文章中展示的那樣,我們可以使用多階段構建在不同的 docker 鏡像之間復制數據。如果我們將緩存移動到專用的 Docker 映像會怎樣?然后我們可以將這個鏡像推送到 Docker Hub 并將其拉入構建過程。
這個過程很簡單。首先在 Docker Hub 中創建兩個不同的圖像。打電話給他們screenly/build-cache和screenly/build-env。在上一篇文章的基礎上,我們使用這個Dockerfile作為基礎screenly/build-env。
在 Dockerfile 中,我們將環境變量設置CCACHE_DIR為/src/ccache. 這一步告訴 ccache 緩存駐留在/src/ccache. 在上一篇文章中,該步驟只是將卷裝入系統。但是,在這種情況下,我們想要更改此步驟,以便緩存位于 之外/src,因為這用于批量安裝代碼庫,例如/usr/ccache.
我們現在可以啟動容器:
$ docker run --rm -t /
-v ~/tmp/qt-src:/src /
-v ~/tmp/qt-build:/build /
-v ~/tmp/ccache:/usr/ccache /
screenly-build-env
完成編譯后,您現在可以構建并推送我們的緩存映像。最終的 Dockerfile 將如下所示:
FROM scratch
COPY ccache /ccache
要構建此映像,請使用以下代碼:
$ cd ~/tmp
$ docker build /
-f /path/to/Dockerfile /
-t screenly/build-cache
$ docker push screenly/build-cache
最后,您現在可以將這一層包含在screenly/build-env. 添加行:
COPY --from=screenly/build-cache /ccache /usr/ccache
下次重建screenly/build-env時,Docker 會自動拉下緩存。此外,您只需在刷新緩存時添加卷掛載。
本文鏈接:http://www.www897cc.com/showinfo-119-2502-0.htmlDocker使用緩存編譯 Qt
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 使用Docker多階段多平臺編譯Qt