Lassen Sie Composer (PHP-Abhängigkeitsmanager) auf einem Docker-Image-Build laufen

Lesezeit: 5 Minuten

Benutzer-Avatar
Mikel Adell

TL;DR Können Sie mir ein Beispiel für ein Docker-Image zeigen, das Composer verwendet, um PHP-Abhängigkeiten zu handhaben?


Alle meine Fragen in diesem Beitrag beziehen sich auf Composer das PHP-Abhängigkeitstool nicht Docker-Komponist der Nachfolger von Feige.

Ich versuche, mein eigenes Docker-Image zum Ausführen zu erstellen WordPress als Composer-Abhängigkeit installiert.

Ich arbeite daran, ein Docker-Image mit dem Docker-PHP-Image als Basis zu erstellen, und was ich tun muss, ist Composer zu installieren und einen Composer-Update-Befehl entweder zur Image-Erstellungszeit oder zur Image-Build-Zeit auszuführen (weiß nicht, ob beides der Fall wäre OK).

Ich kann alles problemlos ausführen, indem ich alle Schritte manuell ausführe (ein Docker-Image ausführen, darauf einschlagen und jeden Schritt kopieren und einfügen).

Aber wenn ich all diese Schritte in eine Docker-Datei stecke, bekomme ich Composer nicht dazu, die Dateien zu schreiben.

Ich habe einige Zeit versucht, ein minimales fehlgeschlagenes Beispiel zu bekommen, aber das, das ich habe, ist kein Minimum.

Mein Test setzt sich wie folgt zusammen (Links zu den relevanten Github-Repos unten)

Dockerfile

NFORMATION ~~~#

# based on
# https://hub.docker.com/r/richarvey/nginx-php-fpm/
# and
# https://hub.docker.com/_/wordpress/

FROM php:7.0.2-apache

MAINTAINER Miquel Adell <[email protected]>

ENV WORDPRESS_VERSION 4.4.1



#~~~ DEPENDENCIES ~~~#

# Add PHP repository to apt source
RUN apt-get update \
    && apt-get install -y \
        libpng12-dev \
        libjpeg-dev  \
        curl \
        sed \
        zlib1g-dev \
    && docker-php-ext-install \
        zip \
        mysqli

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer



#~~~ DIRS ~~~#

WORKDIR /var/www/html/



#~~~ WORDPRESS ~~~#

COPY files/composer.json composer.json
ONBUILD RUN composer update

docker-compose.yml

wordpress:
  image: miqueladell/composed_wordpress_test
  links:
    - wordpress_db:mysql
  environment:
    - VIRTUAL_HOST=miqueladell.dev
    - WORDPRESS_DB_NAME=wordpress
  ports:
   - "80"

wordpress_db:
  image: miqueladell/mariadb-utf8mb4
  environment:
     - MYSQL_ROOT_PASSWORD=password

Mein Test ist wie folgt

  1. Erstellen Sie ein Image, indem Sie diesen Befehl in einem Verzeichnis ausführen, das die oben eingefügte Docker-Datei enthält

     docker build -t miqueladell/composed_wordpress_test .
    

    (keine Fehler im Log)

  2. Verwenden Sie dieses Image, um einen Container zu erstellen, indem Sie den folgenden Befehl in einem Verzeichnis ausführen, das die oben eingefügte docker-compose.yml enthält

     docker-compose up
    

    (keine Fehler im Log)

  3. bash in den laufenden Container, um zu sehen, ob die Dateien dort sind

     docker exec -i -t miqueladellv2_wordpress_1 bash
    
  4. ls von /var/www/html

     [email protected]:/var/www/html# ls -al
     total 12
     drwxr-xr-x 2 www-data www-data 4096 Jan 19 10:50 .
     drwxr-xr-x 5 root     root     4096 Jan 19 10:50 ..
     -rw-r--r-- 1 root     root      138 Jan 15 09:18 composer.json
    

Sie können das in Schritt 4 sehen Komponisten-Update scheint gar nicht gelaufen zu sein.

Ich habe versucht, beide zu verwenden

RUN composer update

und

ONBUILD RUN composer update

auf Dockerfile mit den gleichen Ergebnissen.

Wenn ich zum vorherigen Schritt 4 des Tests zurückkehre und ihn manuell ausführe Komponisten-Update Auf der Bash-Eingabeaufforderung des Docker-Containers bekomme ich:

[email protected]:/var/www/html# composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing johnpbloch/wordpress-core-installer (0.2.1)
    Downloading: 100%

  - Installing johnpbloch/wordpress (4.4.1)
    Downloading: 100%

Writing lock file
Generating autoload files
[email protected]:/var/www/html# ls -al
total 24
drwxr-xr-x 4 www-data www-data 4096 Jan 19 11:12 .
drwxr-xr-x 6 root     root     4096 Jan 19 11:12 ..
-rw-r--r-- 1 root     root      138 Jan 15 09:18 composer.json
-rw-r--r-- 1 root     root     3718 Jan 19 11:12 composer.lock
drwxr-xr-x 4 root     root     4096 Jan 19 11:12 vendor
drwxr-xr-x 5 root     root     4096 Jan 19 11:12 wordpress
[email protected]:/var/www/html#

Das ist genau die Ausgabe, die ich in Schritt 4 erwartet hatte

github-Links zu den vollständigen Dateien

  • Das Entfernen von ONBUILD aus der Zeile ONBUILD composer update scheint bei diesem Beispiel zu funktionieren… also ist meine vorherige Frage falsch, aber das Problem scheint gelöst

    – Mikel Adell

    19. Januar 2016 um 12:10 Uhr

Wenn Sie Composer wie folgt installieren, wird dieses Problem vermieden:

RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \
# Make sure we're installing what we think we're installing!
&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \
&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot \
&& rm -f /tmp/composer-setup.*

  • Das Überprüfen des Hashs ist hier wirklich eine nette Geste

    – erkmene

    27. Mai 2017 um 6:31 Uhr


  • Schöne Umsetzung. Es sollte beachtet werden, dass dies die Snapshot-Version (–snapshot) von Composer installiert.

    – Georg Böhnisch

    16. Oktober 2019 um 21:07 Uhr

Ich bin heute auf dieses Problem gestoßen.

Was es für mich gelöst hat, war, ein anderes Verzeichnis als das im Bild definierte zu verwenden.

Es scheint, als würden Änderungen, die während des Erstellungsprozesses am Verzeichnis vorgenommen werden, verworfen, wenn das Verzeichnis als Volume definiert ist.

Hier ist ein Beispiel für mein funktionierendes Dockerfile

FROM richarvey/nginx-php-fpm

# Install dependencies
RUN apt-get update && \
    apt-get install curl nano && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add update nginx config
COPY conf/nginx-site.conf /etc/nginx/sites-available/default.conf

# Bundle app source 
COPY app/ /app

# Install app dependencies
RUN cd /app && \
    composer install --no-interaction 

EXPOSE 80

Und dann hinein conf/nginx-site.conf Ich habe den Stamm für meine Anwendung aktualisiert (der Kürze halber abgekürzt)

server {
    # ... the rest of your nginx config

    root /app/public;

    # ... the rest of your nginx config
}

  • Denken Sie daran, das Y-Flag zu verwenden: “apt-get install -Y …”

    – Lukas Lukas

    26. Mai 2017 um 14:35 Uhr

1245350cookie-checkLassen Sie Composer (PHP-Abhängigkeitsmanager) auf einem Docker-Image-Build laufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy