In esecuzione compositore installare all’interno di un Dockerfile

Sto cercando di Dockerize mio laravel app.
L’app è già costruito e in git, ma io .gitignore il mio fornitore cartella.
Ho aggiunto un Dockerfile, che assomiglia a questo:

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

Quando ho costruito questo sembra funzionare alla grande. Vedo le dipendenze ottenere scaricato, vedo il caricamento file che viene generato in output. Tuttavia, una volta che la costruzione è completa, il venditore cartella non è in realtà lì. Sto indovinando che è stato fatto tutto in un contenitore intermedio che è stato poi rimosso? Così, quando ho eseguito la finestra mobile-costituiscono, ottengo:
Fatal error: require(): Failed opening required ‘/var/www/html/bootstrap/../vendor/autoload.php’

Questo thread sembra punto il problema – forse – ma in realtà non offrono una soluzione: Compositore di installazione non installare i pacchetti durante l’esecuzione in Dockerfile

  • Provare a utilizzare la COPIA di compositore.json ./ invece di COPIARE compositore.json compositore.serratura ./ (non copiare compositore.lock) E avere questa linea di COPIA . . sopra compositore installare
  • COPIA . . copiare l’intera directory, in modo che copiare compositore.json e compositore.blocca comunque. E perché non si desidera copiare il file di blocco? Questo è quello che voglio basare la mia installazione.
  • Si dovrebbe aggiungere compositore.bloccare il .dockerignore poi. Si prega di dare un’occhiata: getcomposer.org/doc/…
  • Se lo faccio, quindi sono essenzialmente di esecuzione compositore di aggiornamento. Questo non è ciò che voglio. Io non sono dopo le ultime versioni delle dipendenze, voglio le versioni che si trovano nella compositore.file di blocco. Attualmente, il venditore cartella non è ancora stato creato, in modo da ottenere nulla…
  • Hai provato a mettere la COPIA . . sopra compositore comando di installazione?
  • Sì, provato…
  • che cosa avete al vostro mobile-comporre.yml?

InformationsquelleAutor JBxOnline | 2017-10-17



2 Replies
  1. 13

    Questo ha avuto un sacco di scavo per qualcuno di nuovo a Mobile 🙂
    Grazie a @iurii-drozdov per indicarmi la giusta direzione con il commento mobile-comporre.yml.

    Nel mio mobile-comporre.yml, ero di montaggio il mio host lavoro dir in /var/www/html. Questo è accaduto dopo la compilazione. Così il compositore eseguito l’installazione, installato tutte le dipendenze correttamente la corporatura, e poi, quando si esegue la finestra mobile-costituiscono, ero di montaggio il mio host dir nel contenitore e la cancellazione da tutte quelle modifiche.

    La soluzione era quella di eseguire compositore installare dopo il montaggio del volume.
    È chiaro abbastanza per fare questo, semplicemente exec ing nel contenitore dopo l’educa – esecuzione di compositore e di eventuali altri gestori di pacchetti – infine esegue il server web.

    Tuttavia, ho trovato un miglior soluzione. Ho cambiato il mio finale CMD nel Dockerfile a:

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

    Questo sarà il compositore installare e attivare il web server come parte finale della finestra mobile-comporre-up.

    Di credito per la soluzione qui: Mobile – Eseguire un comando dopo il montaggio di un volume

    • È inoltre possibile aggiungere il comando parola chiave sotto il contenitore dichiarazione mobile-si compongono come questo : comando: compositore installare && php artigianale servire –host 0.0.0.0 –porta 5001
    • questa è una buona soluzione, come lungo come si desidera che il venditore cartella come root
    • Che cosa se è Lumen, che non hanno php artisan serve, il CMD per innescare il contenitore di uscita con stato 0. Qualsiasi soluzione a questo?
  2. 1

    Se non si desidera avere il comando in Dockerfile, abbiamo trovato che il modo più semplice è quello di aggiungere questo alla nostra finestra mobile-comporre file:

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

    L’aggiornamento è un po ‘ lento, probabilmente perché è la sincronizzazione con il PHP contenitore.

    • Molto più utili come l’immagine di base potrebbe non contenere curl né php. Complimenti per la portabilità!

Lascia un commento