L'exécution de compositeur installer dans un Dockerfile
Je suis en train de Dockerize mon application laravel.
L'application est déjà construit et dans git, mais je .gitignore mon fournisseur dossier.
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 build, cela semble fonctionner à merveille. Je vois les dépendances obtenir téléchargé, je vois le chargement automatique du fichier généré à la sortie. Cependant, une fois la construction terminée, le vendeur dossier n'est pas réellement là. Je suppose que c'était fait dans un conteneur intermédiaire qui est ensuite éliminé? Donc, quand je lance le panneau-composer jusqu', j'obtiens:
Erreur fatale: require(): Failed opening required '/var/www/html/bootstrap/../vendor/autoload.php'
Ce fil semble pointer à la question - peut-être - mais n'a pas vraiment d'apporter une solution: Compositeur installation ne pas installer les paquets lors de l'exécution dans le Dockerfile
- Essayez d'utiliser le COPIER-compositeur.json ./ au lieu de COPIER les compositeur.json compositeur.verrouillage ./ (ne pas copier compositeur.lock) Et avoir cette ligne de COPIE . . au-dessus de compositeur installer
- COPIE . . copier le répertoire entier, de sorte que la copie de compositeur.json et compositeur.serrure de toute façon. Et pourquoi ne voudrais-je pas copier le fichier de verrouillage? C'est ce que je veux à la base de mon installation sur.
- Vous devez ajouter compositeur.verrouillage de votre .dockerignore ensuite. Veuillez prendre un coup d'oeil: getcomposer.org/doc/...
- Si je fais ça, alors je suis essentiellement de course compositeur de mise à jour. Ce n'est pas ce que je veux. Je ne suis pas après les dernières versions des dépendances, je veux les versions qui sont dans le compositeur.fichier de verrouillage. Actuellement, le vendeur dossier n'est pas encore en cours de création, je ne reçois rien...
- Avez-vous essayé de mettre de la COPIE . . au-dessus de compositeur la commande d'installation?
- Oui - essayé...
- qu'avez-vous à votre panneau-composer.yml?
Vous devez vous connecter pour publier un commentaire.
Cela a pris beaucoup de creuser pour quelqu'un de nouveau à Docker 🙂
Grâce à @iurii-drozdov pour me pointer dans la bonne direction avec ce commentaire sur le menu fixe-composer.yml.
Dans mon menu fixe-composer.yml, j'ai été le montage de mon hôte de travail dir dans /var/www/html. Ce qui s'est passé après la construction. Si le compositeur a couru l'installer, installé toutes les dépendances correctement sur créer, puis, lors de l'exécution de docker-composer jusqu', j'ai été le montage de mon hôte dir dans le récipient et l'apurement de tous ces changements.
La solution était de courir compositeur installer après montage du volume.
C'est assez clair pour ce faire, simplement exec qui pratiquent dans le récipient après de le mettre à exécution compositeur et tous les autres gestionnaires de paquets - puis, enfin, qui exécute le serveur web.
Cependant, j'ai trouvé une solution plus propre. J'ai changé mon dernier CMD dans le Dockerfile à:
Cela va lancer compositeur installer et mettre en place le serveur web en tant que partie finale de l'docker-composer jusqu'.
De crédit pour la solution ici: Docker - Exécution de la commande après le montage d'un volume
php artisan serve
, le CMD va déclencher récipient à la sortie avec le statut de 0. Toute solution à cela?Si vous ne voulez pas avoir la commande dans le Dockerfile, nous avons constaté que la façon la plus simple est d'ajouter à notre menu fixe-composition de fichier:
La mise à jour est un peu lent, probablement parce qu'il est en cours de synchronisation avec le PHP conteneur.