web-dev-qa-db-fra.com

Exécution de composer installer dans un Dockerfile

J'essaye de Dockerize mon laravel app. L'application est déjà construite et dans git, mais je .gitignore mon dossier de fournisseur. J'ai ajouté un Dockerfile, qui ressemble à ceci:

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

Quand je construis, cela semble très bien fonctionner. Je vois les dépendances téléchargées, je vois le fichier de chargement automatique généré dans la sortie. Cependant, une fois la génération terminée, le dossier du fournisseur n'est pas réellement là. Je suppose que tout a été fait dans un conteneur intermédiaire qui a ensuite été retiré? Ainsi, lorsque j'exécute docker-compose up, j'obtiens: Erreur fatale: require (): Échec de l'ouverture requise '/var/www/html/bootstrap/../vendor/autoload.php'

Ce thread semble pointer vers le problème - peut-être - mais ne fournit pas vraiment de solution: L'installation de Composer n'installe pas les packages lors de l'exécution dans Dockerfile

13
JBxOnline

Cela a pris beaucoup de temps pour trouver quelqu'un de nouveau pour Docker :) Merci à @ iurii-drozdov de m'avoir pointé dans la bonne direction avec le commentaire sur le docker-compose.yml.

Dans mon docker-compose.yml, je montais mon répertoire de travail Host dans/var/www/html. Cela s'est produit après la construction. Donc composer a exécuté l'installation, installé toutes les dépendances correctement sur la construction, puis, lors de l'exécution de docker-compose up, je montais mon répertoire Host dans le conteneur et effaçais toutes ces modifications.

La solution était d'exécuter composer install après montage du volume. C'est assez simple de le faire en exécutant simplement ' entrer dans le conteneur après l'avoir activé - en exécutant composer et tout autre gestionnaire de packages - puis en exécutant enfin le serveur Web.

Cependant, j'ai trouvé une solution plus soignée. J'ai changé mon CMD final dans le Dockerfile pour:

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

Cela lancera composer installera et affichera le serveur Web en tant que partie finale du docker-compose up.

Crédit pour la solution ici: Docker - Exécuter la commande après avoir monté un volume

16
JBxOnline

Si vous ne voulez pas avoir la commande dans le Dockerfile, nous avons constaté que le moyen le plus simple était d'ajouter ceci à notre fichier docker-compose:

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

La mise à jour est un peu lente, probablement parce qu'elle se synchronise avec le conteneur PHP.

2
Kien Tran