web-dev-qa-db-fra.com

Obtenir composer (gestionnaire de dépendances php)) pour s'exécuter sur une construction d'image de menu fixe

REMARQUE: je n'utilise plus cet environnement. Il est donc impossible pour moi de tester les réponses et d'en accepter une. Je suis désolé

TL; DR Pouvez-vous me donner un exemple d'image de menu fixe qui utilise composer pour gérer PHP dépendances?

Toutes mes questions dans ce post concernent composer l'outil de dépendance php pas docker-composer le successeur de fig.

J'essaie de créer ma propre image de menu fixe à exécuter wordpress installé en tant que dépendance composer) .

Je travaille sur la construction d'une image Docker en utilisant une image php Docker comme base et ce que je dois faire est d'installer composer) et d'exécuter une commande composer update sur le moment de la création d'image ou sur le temps de construction de l'image (je ne sais pas si les deux seraient d'accord).

Je peux tout faire très bien en exécutant manuellement toutes les étapes (exécuter une image dans le menu fixe, y faire un point et en copier-coller toutes les étapes).

Mais quand je mets toutes ces étapes sur un fichier Docker, je ne reçois pas composer pour écrire les fichiers.

Cela fait un certain temps que j'essaie d'obtenir un exemple d'échec minimal, mais celui que j'ai n'est pas vraiment minimal.

Mon test est composé des éléments suivants (liens vers les dépôts de github appropriés ci-dessous)

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

Mon test est le suivant

  1. Construire une image en exécutant cette commande dans un répertoire contenant le fichier Docker collé ci-dessus

    docker build -t miqueladell/composed_wordpress_test .
    

    (pas d'erreurs dans le journal)

  2. Utilisez cette image pour créer un conteneur en exécutant la commande suivante dans un répertoire contenant le fichier docker-compose.yml collé ci-dessus.

    docker-compose up
    

    (pas d'erreurs dans le journal)

  3. bash dans le conteneur en cours d'exécution pour être en mesure de voir si les fichiers sont là

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

    root@bff14367658b:/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
    

Vous pouvez voir à l’étape 4 que composer update ne semble pas avoir fonctionné du tout.

J'ai essayé d'utiliser les deux

RUN composer update

et

ONBUILD RUN composer update

sur Dockerfile avec les mêmes résultats.

Si je reviens à l'étape 4 précédente du test et que je lance manuellement Composer update sur l'invite bash du conteneur de menu fixe, le message suivant s'affiche:

root@bff14367658b:/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
root@bff14367658b:/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
root@bff14367658b:/var/www/html#

ce qui est exactement la sortie que j'attendais à l'étape 4

J'aimerais des conseils. Merci.

github relie aux fichiers complets

33
Miquel Adell

Installer composer comme ceci évitera ce problème:

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.*
24
Brian Wood

J'ai rencontré ce problème aujourd'hui.

Ce qui a résolu le problème pour moi, c’est d’utiliser un répertoire différent de celui défini dans l’image.

Il semble que les modifications apportées au répertoire pendant le processus de construction soient ignorées si le répertoire est défini en tant que volume.

Voici un exemple de mon travail 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

Et puis dans conf/nginx-site.conf J'ai mis à jour la racine de mon application (raccourcie par souci de concision)

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

    root /app/public;

    # ... the rest of your nginx config
}
20
bmagg