我希望將大量本地和開源程式碼打包到 Docker 容器中,該容器將分發到主機上進行建置和運行。最終容器的目的是以命令列方式執行並輸出結果 ex。 ( docker run cmdcontainer args
)。我遇到的問題是,分發的原始碼需要在它將運行一次的特定主機上進行定位和編譯,這需要幾個小時才能完成。然而,一旦編譯,該命令運行得非常快。
所以我想知道這種工作流程是否有已知的 docker 模式:
分髮帶有原始檔案的 Docker 容器 -> 運行容器以產生包含已編譯二進位檔案的新容器 -> 後續運行執行已編譯的容器
因為這基本上是在舊容器之上分層一個新容器,看起來這應該是可能的,但我是一個 Docker 新手。
答案1
對於每個獨特的主機,我能想到的最佳解決方案是使用磁碟區來實現持久性。您的入口點需要以下工作流程:
- 檢查卷中編譯程式碼的版本
- 如果版本不匹配,請刪除卷內容
- 如果版本未設定或不匹配,請執行編譯
- 將新版本號寫入該卷
- 從卷中的編譯版本運行您的應用程式
這確實要求您的映像建立嵌入版本號,例如 git 雜湊。您可以使用建置參數來做到這一點:
docker build --build-arg GIT_REV=$(git rev-parse --short HEAD) ...
然後你的 Dockerfile 將包含類似以下內容:
ARG GIT_REV
ENV GIT_REV=${GIT_REV}
請注意,任何在沒有磁碟區的情況下執行的使用者仍然會看到每次執行都執行編譯。