2017-07-01 99 views
2

根據官方[php][1]圖像,我有以下Dockerfile用於php運行時。Docker - 安裝卷後執行命令

FROM php:fpm 
WORKDIR /var/www/root/ 
RUN apt-get update && apt-get install -y \ 
     libfreetype6-dev \ 
     libjpeg62-turbo-dev \ 
     libmcrypt-dev \ 
     libpng12-dev \ 
     zip \ 
     unzip \ 
    && docker-php-ext-install -j$(nproc) iconv mcrypt \ 
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ 
    && docker-php-ext-install -j$(nproc) gd \ 
    && docker-php-ext-install mysqli \ 
    && docker-php-ext-enable opcache \ 
    && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ 
    && php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ 
    && php composer-setup.php \ 
    && php -r "unlink('composer-setup.php');" \ 
    && mv composer.phar /usr/local/bin/composer 

我在運行時遇到問題composer install

我猜測的Dockerfile運行安裝卷之前,因爲我收到一個composer.json找不到文件的錯誤,如果添加:

... 
&& mv composer.phar /usr/local/bin/composer \ 
&& composer install 

以上。

但是,把下面的屬性docker-compose.yml

command: sh -c "composer install && composer require drush/drush" 

似乎在命令執行完畢後終止容器。

有沒有一種辦法:

  • 等待捲成爲安裝
  • 運行composer install使用安裝composer.json文件
  • 有容器保持運行afters

+1

Dude隨着Composer的每一個新版本的移除,經常更換哈希檢查。順便說一下,您希望讓您的自定義入口點在容器啓動時進行安裝。另外,您應該將您的應用程序數據移動到僅限數據的容器,以便您可以分解責任。然後,您的應用程序可以獨立於Web服務器的基礎架構進行部署。祝你好運 –

+0

@mike你能提供一個使用數據專用容器的例子,以及它如何與docker-compose一起使用?或者,提供一個你認爲很好地描述這個概念的資源?或兩者? :-) cheers –

+1

在網上有很多例子可以找到,只需查找'data only container'或'docker persistence strategy'。你所做的只是構建你的應用程序(作曲家安裝/文檔/資產等),然後獲得最小的圖像(144字節圖像可用!),並將所有內容複製到它。使用docker-compose中的'volumes_from'指令將該數據裝載到php映像中的apache根目錄。所有這些都可以通過Jenkins,Gitlab等任何CI/CD系統來實現。 –

回答

2

我大體上同意克里斯的回答當地的發展。我將提供一些與最近的Docker功能相結合的功能,這些功能可能會爲使用相同映像進行本地開發和最終生產部署設置路徑。

我們首先從可以用於本地開發或包含代碼和依賴項的部署的方式構建的映像開始。在最新的Docker版本(17.05)中,我們可以利用新的多階段構建功能。在這種情況下,我們可以先將所有Composer依賴項安裝到構建上下文中的文件夾,然後將它們複製到最終映像,而無需將Composer添加到最終映像。這可能是這樣的:

FROM composer as composer 
COPY . /app 
RUN composer install --ignore-platform-reqs --no-scripts 

FROM php:fpm 
WORKDIR /var/www/root/ 
RUN apt-get update && apt-get install -y \ 
     libfreetype6-dev \ 
     libjpeg62-turbo-dev \ 
     libmcrypt-dev \ 
     libpng12-dev \ 
     zip \ 
     unzip \ 
    && docker-php-ext-install -j$(nproc) iconv mcrypt \ 
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ 
    && docker-php-ext-install -j$(nproc) gd \ 
    && docker-php-ext-install mysqli \ 
    && docker-php-ext-enable opcache 
COPY . /var/www/root 
COPY --from=composer /app/vendor /var/www/root/vendor 

這將刪除所有來自應用程序圖像本身作曲的,而是使用第一階段安裝的依賴在另一種情況下,並在將它們複製到最終圖像。

現在,在開發過程中你有一些選擇。根據您的docker-compose.yml命令,它聽起來像是將應用程序安裝到容器中的.:/var/www/root。您可以添加composer服務到您的docker-compose.yml類似於我的示例https://gist.github.com/andyshinn/e2c428f2cd234b718239。在這裏,當你需要在本地更新依賴關係時,你只需要做docker-compose run --rm composer install(這樣可以在容器內部建立依賴關係,這對於本機編譯的擴展很重要,特別是在部署容器和在Windows或Mac上開發時)。

另一種選擇是做一些類似於Chris已經建議的事情,並使用正式的Composer圖像在需要時更新和管理依賴關係。我做了這樣的事情在當地在那裏我有私人的依賴在GitHub上這需要SSH認證前:

docker run --rm --interactive --tty --volume $PWD:/app:rw,cached --volume $SSH_AUTH_SOCK:/ssh-auth.sock --env SSH_AUTH_SOCK=/ssh-auth.sock --volume $COMPOSER_HOME:/composer composer:1.4 install --ignore-platform-reqs --no-scripts 

回顧一下,推理使用外部容器/服務建設中的形象和安裝作曲家依賴這種方法:

  • 平臺特定依賴關係將針對容器(Linux架構與Windows或Mac)正確構建。
  • 否您的本地計算機上需要Composer或PHP(它全部包含在Docker和Docker Compose中)。
  • 您創建的初始圖像是可運行和可部署的,無需在其中安裝代碼。在開發中,您只是用本地卷覆蓋/var/www/root文件夾。
1

如果這是針對一般開發環境的,那麼它的意圖就不是很理想,因爲它將應用程序與Docker配置耦合在一起。

只需運行composer install通過其他方式(在dockerhub上有一個可用於此的圖像,它允許您僅執行(docker run -it --rm -v $(pwd):/app composer/composer install)。


但是是有可能,你需要在Dockerfile的最後一行是bash -c "composer install && php-fpm"


  • 等待捲成爲安裝

沒有,體積不能在泊塢窗構建過程來進行安裝。儘管可以在複製源代碼。

  • 運行作曲家安裝使用安裝composer.json文件

沒有見上響應。

  • 具有容器保持後

是的運行,將需要執行php-fpm --nodaemonize(這是一個長期運行的進程,因此它不會終止。

+1

您可以爭辯說,所有'composer install'都會添加應該包含在圖像中的應用程序的_are_dependencies。通過外部操作,可能會在部署期間或環境之間丟失或錯誤匹配這些依賴關係。 –

+0

好點。在這種情況下,源代碼也必須添加,這聽起來不像OP的意圖。 –

+0

我同意。我認爲開發你的答案確實有意義,我喜歡你通過使用'composer'圖像將它修改爲更多的「Docker方式」。我也試圖在最終將應用程序部署到生產環境時提前考慮,在這種情況下,答案可能會有所不同。 –