web-dev-qa-db-fra.com

Comment utiliser Docker avec Drupal et Drush?

Je voudrais utiliser drush . Il doit être exécuté dans le conteneur Drupal. Il y a aussi un drush docker repo . Mais je ne sais pas comment le rendre disponible dans le conteneur Drupal. C'est mon premier projet Docker et Drupal, alors je me trompe peut-être complètement.

Comment utiliser drush avec cette image Drupal Docker? https://hub.docker.com/_/drupal/ Est-il possible de le gérer avec docker-compose? Peut-être étendre le conteneur drupal?

C'est mon docker-compose.yml:

mysql:
  image: mysql:5.5
  ports:
    - "3306:3306"
  environment:
    - MYSQL_USER=xxxxx
    - MYSQL_PASSWORD=xxxxxx
    - MYSQL_ROOT_PASSWORD=xxxxxx
    - MYSQL_DATABASE=xxxxxx

drupal:
  image: drupal:8.0.4
  links:
    - mysql
  ports:
    - "8080:80"
14
citizen404

Comme toujours avec Docker, il existe de nombreuses options pour utiliser drush. Mais notez que pour que drush d’avoir accès à la base de données (par exemple, mysql), il devrait y avoir des volumes du conteneur mysql sur Drupal, tels que:

 version: '2'
 services:
   drupal:
     image: drupal:8.0.4-Apache
     volumes_from:
       - mysql
   mysql:
     image: mysql
     volumes:
       - /var/lib/mysql
       - /usr/bin
...

Voici les plus communs.

1) Montez votre drush local sur le conteneur Drupal:

version: '2'
services:
  drupal:
    image: drupal:8.0.4-Apache
    volumes:
      # Mount local drush to your container.
      - /usr/local/bin/drush:/drush/drush

2) Créez un image du menu fixe Docker uniquement pour drush et mettez l’exécutable en volume dans votre conteneur Drupal. Voir un exemple à https://github.com/RobLoach/drush-docker/issues/32#issuecomment-222321265 .

3) Installez Drush dans le conteneur Drupal après son exécution. Par exemple:

$ docker exec -ti <MY_DRUPAL_CONTAINER> \ 
bash -c 'php -r "readfile('https://s3.amazonaws.com/files.drush.org/drush.phar');" \
> drush  && chmod +x drush && mv drush /usr/local/bin'

4) Installez Drush sur Drupal avec création d’une image Docker (avec un fichier Docker). Exemple:

FROM drupal:8.0.4-Apache

MAINTAINER ...

RUN php -r "readfile('https://s3.amazonaws.com/files.drush.org/drush.phar');" > drush \
&& chmod +x drush \
&& mv drush /usr/local/bin

5) Utilisez un autre conteneur avec drush et le volume il au conteneur Drupal à l'aide du fichier docker-compose.yml. Exemple:

version: '2'
services:
  drupal:
    image: drupal:8.0.4-Apache
    volumes_from:
      - drush
  drush:
    image: drush/drush
    volumes:
      - /usr/local/bin/drush
      - /usr/local/bin/composer
5
TheodorosPloumis

Pour que Drush fonctionne efficacement, il est préférable de l'exécuter à partir du conteneur qui exécute Drupal. Pour cela, ajoutez une ligne dans votre fichier Docker.

# Set base Image/tag here. 
FROM drupal:8-fpm 
# Get a global installation of Drush on the web / drupal container 
RUN php -r "readfile('http://files.drush.org/drush.phar');" > drush && chmod +x drush && mv drush /usr/bin/

Pour une utilisation réelle, il vaut mieux envoyer des alias Drush distincts pour utilisation, à la fois du conteneur et de l'hôte (via la clé publique SSH). A titre d'exemple, examinez ces alias et considérez l'ensemble de la configuration comme une implémentation de référence: https://github.com/srijanaravali/docker-blueprint/blob/master/docker-utils/drush/local.aliases.drushrc. php

Vous pouvez transporter ces alias dans le conteneur en ayant quelque chose comme ceci dans votre fichier Docker:

# Push our aliases into the container ~/.drush 
ADD /path/to/your/drush-aliases/* ~/.drush/

ou - pour un contrôle partagé avec l'hôte, vous pouvez envisager de le monter en tant que volume dans votre fichier docker-compose.yml.

volumes:
  - ~/.drush/:/root/.drush/

Vous pouvez maintenant exécuter des commandes Drush sur le conteneur comme ceci: docker exec drush @alias <command>. Vous pouvez utiliser alias pour être quelque chose de moins intensif au clavier, bien sûr.

Ou, utilisez drush de votre hôte en invoquant l'alias SSH que vous avez fourni à la place - drush @alias-ssh <command>

4
p6.srijan

J'ai passé beaucoup trop de temps à faire en sorte que cela fonctionne. Voici mes conclusions.

Comme OP, je n’ai jamais eu l’image drush qui fonctionne sur le réseau local de dockers, il m’a donc semblé plus simple de joindre drush via composer à l’image drupal (voir Dockerfile ci-dessous). 

Cela fonctionne un peu, si vous exécutez dans le conteneur, vous pouvez exécuter drush status, mais il ne se connectera pas au serveur mysql. Il y a deux raisons à cela:

  1. Le paquet mysql-client est nécessaire pour se connecter à distance à la base de données (puisque nous l'exécutons sur un réseau local).

  2. Le nom d'hôte mysql doit être explicitement défini dans le fichier docker-composition (ou la commande d'exécution de docker).


C'est mon Dockerfile:

FROM drupal:8.3.7-Apache

# Install packages
RUN rm /bin/sh && ln -s /bin/bash /bin/sh && \
    apt-get update && apt-get install --no-install-recommends -y \
    curl \
    wget \
    vim \
    git \
    unzip \
    mysql-client

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php && \
    mv composer.phar /usr/local/bin/composer && \
    ln -s /root/.composer/vendor/bin/drush /usr/local/bin/drush

# Install Drush
RUN composer global require drush/drush && \
    composer global update

# Clean repository
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

Les paquets importants sont curl (évidemment) et mysql-client.

Et voici les parties pertinentes du fichier docker-compose.yml:

version: '3.3'

services:

  drupal:
    image: drupal
    build: ./docker/drupal
    env_file:
      - ./docker/environment.env
    ports:
      - "8080:80"
    depends_on:
      - mysql
    restart: always

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    volumes:
      - ./docker/phpmyadmin/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
    env_file:
      - ./docker/intervention/environment.env
    ports:
      - "8080:80"
    depends_on:
      - mysql
    restart: always

  mysql:
    image: mysql
    build: ./docker/mysql
    env_file:
      - ./docker/environment.env
    hostname: mysql
    ports:
      - 3306:3306
    volumes:
      - mysql-data-d8:/var/lib/mysql
    restart: always

volumes:
  mysql-data-d8:

Pourquoi configurer explicitement le nom d'hôte

Le deuxième problème ci-dessus est particulièrement diabolique puisque drush utilise la configuration de settings.php pour se connecter à mysql. Mais la clé 'Host' dans le tableau des bases de données est interprétée différemment, apparemment et drupal. Voici la section pertinente de settings.php:

$databases = array (
  'default' => array (
    'default' => array (
      'database' => $envs['MYSQL_DATABASE'] ?? '',
      'username' => $envs['MYSQL_USER'] ?? '',
      'password' => $envs['MYSQL_PASSWORD'] ?? '',
      'Host' => 'mysql',//php_sapi_name() === 'cli' ? 'a8597b38be21' : 'mysql',
      'port' => '3306',
      'driver' => 'mysql',
      'prefix' => 'drupal_',
      'charset' => 'utf8mb4',
      'collation' => 'utf8mb4_general_ci',
      'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
    ),
  ),
);

La ligne commentée après 'Host' => 'mysql' est une tentative précédente prise à partir d'une autre réponse SO et illustre le problème. Drush utilise l'API du serveur de ligne de commande, qui est différente de celle utilisée par drupal. Le nom d'hôte alternatif est l'identifiant de hachage du conteneur en cours d'exécution, qui peut être trouvé en exécutant le SQL (à partir de phpmyadmin par exemple): 

SHOW VARIABLES WHERE Variable_name = 'hostname' (pris forme this )

Cette valeur change chaque fois que le conteneur est mis à jour. Par conséquent, pour le rendre permanent, le nom d'hôte est explicitement indiqué dans docker-compose.yml, se ci-dessus.


Edit: J'ai créé un petit projet pour héberger un environnement de développement drupal + drush + phpmyadmin basé sur ceci: https://github.com/glaux/drupal8docker

3
glaux

Une des solutions pour Drupal 8 - Docker - Drush combo est:

  1. Étape: Installer Drush dans l'image où vous avez le serveur Apache, appelons cette image de menu fixe "php5".
  2. Étape: créez un alias dans votre fichier ~/.bashrc comme ceci:

    alias dr5='docker-compose run php5 /root/.composer/vendor/bin/drush --root=/var/www/html/docroot';
    

Dans cet alias, j'utilise le composeur Docker, mais c'est la même chose avec Docker, vous exécutez la commande Drush sur l'image php5 en précisant où se trouve votre drush dans Docker et où votre base de code est sur Docker. De cette façon, vous l’utilisez simplement comme ceci:

dr5 cr

Pour la commande de reconstruction de cache, dans votre répertoire de code local.

1
Arnold PÉTER

Essayez quelque chose comme https://github.com/wodby/docker4drupal . Pour moi, c'est très utile et flexible de développer Drupal avec Docker.

0
DrHolera

Je pense que vous avez deux options: vous pouvez exécuter le conteneur drush/drush séparément et utiliser un volume de stockage partagé afin qu'il ait accès aux fichiers que Drupal va utiliser.

Ou vous pouvez créer une nouvelle image contenant drush et drupal. Voir https://docs.docker.com/engine/userguide/containers/dockerimages/

Vous pouvez probablement utiliser le fichier Dockerfile pour l’image drush et l’image drupal comme guide.

0
dnephin

Ce que j'ai choisi de faire, c'est d'installer le composeur dans mon conteneur web.

D'abord, j'installe Composer, puis j'ai besoin de Drush dans le répertoire que je veux.

Exemple de Dockerfile:

FROM php:7.1-Apache

RUN a2enmod rewrite

# Install dependencies
RUN apt-get update \
    && apt-get install -y git \
    && docker-php-ext-install pdo pdo_mysql \
    && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && mv composer.phar /usr/local/bin/composer

RUN cd /var/www/html \
    && composer require drush/drush

Si Drush est déjà une dépendance dans le composer.json de votre projet, vous pouvez simplement composer install le.

0