[英]should I run composer install inside my docker build
我可能有一個看起來像這樣的docker文件:
COPY . ./
RUN composer install --no-dev --no-interaction -o
但我在我的composer.json中有私有存儲庫,這要求我復制ssh鍵以使docker構建正常工作。 我覺得在我的php應用程序docker鏡像中包裝我的ssh鍵感到很不舒服。
或者,我可以在docker build之外運行composer install(例如在build.sh bash腳本中),並在填充vendor /之后復制目錄。 這是正確的方法嗎?
還有其他方法可以解決這個問題嗎?
這是一個非常好的問題,它描述了我現在面對過幾次的原則,實際上是兩個獨立但相關的問題:
1.)如何最好地處理Docker中的瞬態文件
Docker非常擅長封裝環境的全部和完全重新創建。 如果您在容器“外部”處理部分進程,即在docker build
過程之外運行composer install
,那么您的可移植構建過程就會減少,因為您可能已經引入了您不了解的機器/環境依賴性。
如果你總是在Docker中重建完整的環境,那么你可以保證你的依賴關系總是得到滿足,並且你可以將dockerfile提供給其他任何人,並且他們也很有信心能夠在沒有問題的情況下在本地重建。
瞬態文件非常適合在Docker中構建! 所以我會嘗試盡可能在容器內構建它們。
2.)如何從Docker構建過程中解除授權
這引出了我們的第二個問題,如何從構建中解除授權?
選項1 - 在作曲家auth.json中烘焙,其中包含專用構建用戶的信用卡:
正如其他答案所說,您可以“烘焙”憑據,然后再次刪除它們。 但是你不想像你的ssh鍵一樣“烘烤”敏感的東西。 Composer支持auth.json文件,那么為什么不創建一個專用的構建用戶並在auth.json文件中存儲其cred(而不是你的)? 如果它受到損害,您可以更改密碼。 編輯器安裝完成后刪除或覆蓋文件。
COPY . ./
RUN composer install --no-dev --no-interaction -o
RUN rm -f ./auth.json
選項2 - 使信用卡本身成為瞬態並使用docker exec將它們傳遞到Docker容器中:
我還沒有完全測試過這種方法,但我不明白為什么這樣的東西不起作用。
1.)你構建了一個基本的PHP容器,它能夠運行'composer install'(或者使用docker hub中的一個)
2.)你旋轉這個基礎容器,使其運行
3.)您使用docker exec將您的信用卡傳遞給已經烘焙到容器中的包裝腳本。 包裝器腳本將使用HTTP基本身份驗證運行composer install - 它已經具有用戶名,因此您只需要根據http-basic技術提供密碼
docker exec -d my_base_php_container php -f /my_wrapper_script.php ${PASSWORD}
4.)您將此容器提交為新圖像
docker commit --change "composer install" ${CONTAINER_ID} my_installed_image:1.0
滑稽。 發布此問題僅幾天后,Docker 17.05就發布了,並為此提供了一個解決方案: 多階段構建 。 只需將您的作曲家內容放入dockerfile並構建您的應用程序即可。 然后,開始第二階段並將您的應用程序復制為第一階段的構建工件。
我認為在你描述的情況下,在docker build之外進行composer安裝是有意義的。
您通常會有一個初始構建過程來構建您的應用程序代碼。 此構建可能會運行一些linting或自動測試,然后生成包含運行應用程序所需的所有代碼的工件。 這將包括您的源代碼,以及您的供應商文件夾和任何自動生成的代碼(ORM類,緩存等)。 這些工件通常是tar文件。
然后,您可以將該代碼工件復制到后續docker構建中的docker容器中。
您可以隨時進行構建,即COPY~ / .ssh,運行composer install然后運行rm鍵......之后,如果以后需要使用ssh - 在docker-compose中(或通常由-v)你只需在運行期間使用volume / -v在本地掛載.ssh :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.