簡體   English   中英

無論如何使用 docker 作曲家圖像和自定義 php?

[英]Is there anyway to use docker composer image with custom php?

我想為我的 laravel 應用程序在多級 dockerfile 中使用 docker 作曲家圖像以減小其大小。 我的依賴項需要 PHP 7.4 的問題,但作曲家的 PHP 是 8.1.1。 有沒有辦法自定義這個? 如果沒有辦法降級它的 PHP 版本,我該如何減小我的 docker 映像的大小,我應該使用什么來安裝我的項目依賴項?

我嘗試使用--ignore-platform-reqs標志安裝依賴項,但應用程序在構建后無法運行。

FROM composer:latest

COPY database/ database/

COPY composer.json composer.json
COPY composer.lock composer.lock

RUN composer install

Composer 映像將使用當前最新版本的 PHP,因此composer:latest永遠不會為您提供 7.4。 您可以向后掃描舊的 Composer docker 映像,直到找到基於 7.4 的最新映像,然后使用該映像的特定版本。

FROM composer:1.10.19

但是請注意,您永遠不會以這種方式獲得作曲家的更新版本。

或者,如果大小是一個問題,那么您可以將您的圖像基於alpine:latest (它很小,目前在其應用程序倉庫中使用 7.4),然后使用apk add php-cli安裝 PHP。 這將為您提供大約 20mb 的圖像,但 Alpine 遲早會將其基礎 PHP 更新為 8.0,您的圖像會損壞。

可能您最好的選擇是將您的映像基於顯式版本化的 PHP 容器之一,例如php:7.4-cli-alpine ,然后將最新的 Composer 安裝到該映像中。 這將使您更好地控制在您的映像中運行的 PHP 版本,並且稍后復制此映像以使其基於 8.0 進行升級測試將非常容易。

我最近遇到了這個問題,並通過兩個步驟解決了它。

  1. 使用platform配置告訴作曲家使用 PHP 的指定版本。
  2. 告訴作曲家不要生成自動加載,並在最終圖像或運行正確版本的 PHP 的圖像中手動執行。

這最近成為一個問題,因為在 PHP 8.1 中, post-autoload-dump開始拋出有關 Laravel 的Collection class 的錯誤。 后自動加載腳本正在運行 Laravel 代碼,這意味着即使我們剛剛安裝了 v 7.X 的依賴項,我們仍在使用 8.1 執行腳本。

可能有更好的方法來解決這個問題,如果有,請告訴我。 但這就是我所做的。

更新了composer.json以指定平台:

"config": {
  "platform": {
    "php": "7.3.33" // Or your specific version
  }
},

告訴作曲家跳過自動加載生成

RUN composer install --no-autoloader

最后,在我的最終圖像中:

RUN composer dump-autoload

這里的缺點是您必須在最終映像中安裝 Composer,這在某種程度上違背了在構建期間拆分作業的目的。

您可以選擇遵循Composer docker 映像自述文件中的建議並以這種方式包含它,並完全放棄多階段構建:

COPY --from=composer /usr/bin/composer /usr/bin/composer

雖然我不能自信地說沒有更好的選擇來解決這個問題,但我希望這個答案能夠解釋問題存在的原因,並為您指明解決問題的正確方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM