我正在構建一個用C++編寫的服務器,並且想用Docker與docker-compose一起部署它。做這件事的「正確方法」是什麼?我應該從Dockerfile調用make
還是手動構建,上傳到某個服務器,然後從Dockerfile中上傳COPY
二進制文件?用Docker構建一個已編譯的應用程序
回答
我會這樣做的方式是在你的容器外部運行你的構建,並只將構建的輸出(你的二進制文件和任何必要的庫)複製到你的容器中。然後,您可以將容器上傳到容器註冊表(例如,使用託管的容器或自己運行),然後從該註冊表中將其拉到生產機器上。因此,流動看起來是這樣的:
- 編譯二進制
- 測試/理智,檢查二進制本身
- 建集裝箱二進制
- 測試/理智,檢查容器圖像圖像與二進制
- 上傳到容器註冊表
- 部署到staging/test/qa,從註冊表中取出
- 部署督促,從
因爲它是重要的,你之前的生產部署測試,要測試的正是你會在生產中部署相同的事情註冊表拉,所以你不想提取或者在構建之後以任何方式修改Docker鏡像。
我不會跑構建內你計劃在督促部署容器,因爲那麼你的容器將有更多的文物各種(如臨時生成輸出,工具等),你不需要進行生產並且不必要地增加容器映像,而不使用部署的東西。
該解決方案與Docker理念不完全一致。這可能導致相同的老問題「哦,但它在我的機器上工作」。除非C++應用程序很少或沒有依賴關係,並且不依賴共享對象文件(.so文件),否則此解決方案將導致鏈接不正確版本的依賴關係 - blueskin 49分鐘前 – blueskin
@blueskin - 感謝您提供此信息。我也想過這個;我認爲一種解決方案是使用兩個容器:一個用於構建,一個卷映射到將輸出導出到主機,第二個容器用於部署沒有任何構建工件或臨時文件,但只包含最終構建輸出。思考? –
我的建議是完全開發,構建和測試容器本身。這確保了Docker的理念,即開發人員的環境與生產環境相同https://blog.newrelic.com/2016/06/20/docker-osx-mac/ 尤其是,在C++應用程序中,通常與共享庫/對象文件存在依賴關係。
我不認爲在Docker上有開發,測試和部署C++應用程序的標準化開發過程。 要回答你的問題,我們這樣做是因爲現在是這樣,對待容器作爲開發環境和執行一套做法對球隊這樣的:
- 我們的代碼庫(除了配置文件)總是生活共享卷(本地機器上)(版本上GIT)上
- 共享/依賴庫和二進制文件等... 總是活容器
- 生成&測試上容器和提交所述圖像清潔不希望的物體上之前文件,庫等...並確保
docker diff
的變化如預期的那樣 - 更改/更新環境(包括共享庫),依賴性始終記錄在案並與團隊溝通。
我有困難docker-compose
自動化我們的構建我結束了使用docker build
的一切:
運行
三層 - >開發 - >打造
然後我將構建輸出複製到'部署'映像中
運行 - >部署
四層玩:
運行- 包含任何軟件包需要爲應用程序運行
- 例如libsqlite3-0
FROM <projname>:run
- 包含了構建
- 例如需要的軟件包克++,cmake的,libsqlite3-dev的
- Dockerfile執行任何外部構建
- 例如步驟來建立升壓python3(不包管理器回購的)
FROM <projname>:develop
- 包含源
- Dockerfile執行內部版本(代碼更改頻繁)
- 內置二進制文件被複製出該映像以供部署使用
FROM <projname>:run
- 輸出複製到圖像,並安裝用於啓動應用程序
文件夾結構
RUN
或ENTRYPOINT
看起來是這樣的: .
├── run
│ └── Dockerfile
├── develop
│ └── Dockerfile
├── build
│ ├── Dockerfile
│ └── removeOldImages.sh
└── deploy
├── Dockerfile
└── pushImage.sh
設置構建服務器意味着執行:
docker build -f run -t <projName>:run
docker build -f develop -t <projName>:develop
每次我們做一個構建,出現這種情況:
# execute the build
docker build -f build -t <projName>:build
# install build outputs
docker build -f deploy -t <projName>:version
# if successful, push deploy image to dockerhub
docker tag <projName>:<version> <projName>:latest
docker push <projName>:<version>
docker push <projName>:latest
我是指人們對Dockerfiles爲如何如果構建失敗構建/運行/安裝工程
文檔並且輸出不足以進行調查,我可以在<projname>:build
中運行/bin/bash
並捅過來查看出了什麼問題
看起來很酷。我很高興看到你的Github回購以HelloWorld C++爲例(所有4個docker文件和兩個shell文件......)感謝分享。 – zipzit
- 1. 使用已編譯的類文件創建一個新的Java應用程序
- 2. gitlab.com CI-在docker中使用docker構建NodeJS應用程序
- 3. 運行已編譯的iPhone模擬器應用程序構建? (.app)沒有Xcode?
- 4. 應用程序可以編譯並創建另一個應用程序嗎?
- 5. Docker構建的多個應用程序和插件?
- 6. 什麼是iOS應用程序的編譯/構建文件?
- 7. 構建Web應用程序編程
- 8. 構建一個picketlink應用程序
- 9. 構建一個playframework應用程序
- 10. 構建一個iPhone應用程序與
- 11. 將已編譯的應用程序遷移到基於Web的應用程序
- 12. 構建Java編譯/執行Web應用程序
- 13. 編譯器/鏈接器錯誤,同時構建應用程序
- 14. 從工作導軌應用程序在線編譯/構建ruby
- 15. LLVM編譯器試圖構建應用程序
- 16. 在C++應用程序中構建/編譯libcurl問題
- 17. 如何構建/編譯ndk應用程序?
- 18. 爲iOS 4.2到iOS 6構建/編譯應用程序?
- 19. 如何從APK編輯已編譯的Android應用程序類
- 20. 「使用Docker創建React應用程序」
- 21. 如何創建一個AngularJS應用程序的Docker容器?
- 22. 使用Docker構建應用程序堆棧
- 23. 如何使用docker構建多租戶應用程序
- 24. 如何使用docker構建J2EE應用程序
- 25. 使用gradle構建docker play應用程序
- 26. 錯誤與編譯Hello World程序Android應用程序的構建路徑
- 27. 使用SBT本地打包程序構建的調試Docker應用程序
- 28. 構建應用程序時由Xcode編譯的未使用的類是什麼?
- 29. 在MATLAB中查找已編譯的應用程序的路徑
- 30. 已編譯的應用程序中的Matlab網絡瀏覽器
無論哪種方式都應該工作,我更喜歡你的第一個選項 – user2915097
但是你會在生產機器上有開發文件(例如'-dev'包)。那是...呃...不是很好,呃? –
不,您可以構建,然後清理並只保留容器中的可執行文件。 – user2915097