私は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で実行するときにパッケージをインストールしません
これは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-ボリュームのマウント後にコマンドを実行
Dockerfileにコマンドを含めたくない場合、最も簡単な方法はこれをdocker-composeファイルに追加することであることがわかりました。
composer_installation:
container_name: composer_installation
image: composer
volumes:
- ./:/app
command: composer install --ignore-platform-reqs
おそらくPHPコンテナーと同期しているため、更新は少し遅くなります。