web-dev-qa-db-ja.com

実行中composer= Dockerfile内にインストール

私はlaravelアプリをDockerizeしようとしています。アプリは既にgitでビルドされていますが、ベンダーフォルダーを.gitignoreします。次のようなDockerfileを追加しました。

FROM php:7.1-fpm-Alpine

RUN apk update && apk add curl && \
  curl -sS https://getcomposer.org/installer | php \
  && chmod +x composer.phar && mv composer.phar /usr/local/bin/composer

RUN apk --no-cache add --virtual .build-deps $PHPIZE_DEPS \
  && apk --no-cache add --virtual .ext-deps libmcrypt-dev freetype-dev \
  libjpeg-turbo-dev libpng-dev libxml2-dev msmtp bash openssl-dev pkgconfig \
  && docker-php-source extract \
  && docker-php-ext-configure Gd --with-freetype-dir=/usr/include/ \
                                   --with-png-dir=/usr/include/ \
                                   --with-jpeg-dir=/usr/include/ \
  && docker-php-ext-install Gd mcrypt mysqli pdo pdo_mysql Zip opcache \
  && pecl install mongodb redis xdebug \
  && docker-php-ext-enable mongodb \
  && docker-php-ext-enable redis \
  && docker-php-ext-enable xdebug \
  && docker-php-source delete \
  && apk del .build-deps

WORKDIR /var/www/html

COPY composer.json composer.lock ./
RUN composer install --no-scripts --no-autoloader

COPY . .
RUN chmod +x artisan

RUN composer dump-autoload --optimize && composer run-script post-install-cmd

CMD php artisan serve --Host 0.0.0.0 --port 5001

私が構築するとき、これはうまくいくようです。依存関係がダウンロードされるのを見ると、出力にautoloadファイルが生成されるのを見る。ただし、ビルドが完了すると、ベンダーフォルダーは実際にはありません。私はそれがすべて削除された中間コンテナで行われたと推測していますか?したがって、docker-compose upを実行すると、次のエラーが表示されます。致命的なエラー:require():必要なオープンに失敗しました '/var/www/html/bootstrap/../vendor/autoload.php'

このスレッドは問題を指しているようです-おそらく-ソリューションを提供していません: ComposerインストールはDockerfileで実行するときにパッケージをインストールしません

13
JBxOnline

これはDockerを初めて使用する人のために多くの掘り出しを行いました:) docker-compose.ymlに関するコメントで正しい方向を示してくれた@ iurii-drozdovに感謝します。

Docker-compose.ymlで、ホスト作業ディレクトリを/ var/www/htmlにマウントしていました。これはビルド後に発生しました。だからcomposer=インストールを実行し、ビルドですべての依存関係を正しくインストールした後、docker-composeを実行するときに、ホストdirをコンテナにマウントし、すべての変更を消去しました。

解決策は、ボリュームをマウントしてcomposer installafter)を実行することでした。これを実行するには、単にexec 'するだけです。コンテナを起動した後、コンテナに入れます-composerおよび他のパッケージマネージャを実行しています-そして最後にWebサーバーを実行しています。

しかし、きちんとした解決策を見つけました。 Dockerfileの最終CMDを次のように変更しました。

CMD bash -c "composer install && php artisan serve --Host 0.0.0.0 --port 5001"

これはcomposer installを実行し、docker-compose upの最後の部分としてWebサーバーを起動します。

ここでのソリューションの功績: Docker-ボリュームのマウント後にコマンドを実行

16
JBxOnline

Dockerfileにコマンドを含めたくない場合、最も簡単な方法はこれをdocker-composeファイルに追加することであることがわかりました。

composer_installation:
  container_name: composer_installation
  image: composer
  volumes:
    - ./:/app
  command: composer install --ignore-platform-reqs

おそらくPHPコンテナーと同期しているため、更新は少し遅くなります。

2
Kien Tran