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"
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
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>
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:
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).
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:
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
Une des solutions pour Drupal 8 - Docker - Drush combo est:
É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.
Essayez quelque chose comme https://github.com/wodby/docker4drupal . Pour moi, c'est très utile et flexible de développer Drupal avec Docker.
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.
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.