it-swarm.com.de

Wie benutzt man Docker mit Drupal und Drush?

Ich würde gerne drush verwenden. Es muss im Drupal-Container ausgeführt werden. Es gibt auch ein Drush Docker Repo . Aber ich habe keine Ahnung, wie ich es im Drupal-Container zur Verfügung stellen soll. Es ist mein erstes Docker- und Drupal-Projekt, also verstehe ich die Dinge vielleicht völlig falsch.

Wie kann ich Drush mit diesem Drupal Docker-Bild verwenden? https://hub.docker.com/_/drupal/ Kann man es mit docker-compose verwalten? Vielleicht den Drupal-Container erweitern?

Das ist mein 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

Wie immer bei Docker gibt es viele Möglichkeiten, Drush zu verwenden. Beachten Sie jedoch, dass, um drush Zugriff auf die Datenbank zu erhalten, (z. B. mysql) Datenträger aus dem mysql-Container auf Drupal vorhanden sein sollten, z.

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

Hier sind die häufigsten.

1) Montieren Sie Ihren local drush in den Drupal-Container:

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

2) Erstellen Sie ein Docking-Image für data only für drush und füllen Sie die ausführbare Datei in Ihren Drupal-Container. Ein Beispiel finden Sie unter https://github.com/RobLoach/drush-docker/issues/32#issuecomment-222321265 .

3) Installieren Sie Drush im Drupal-Container, nachdem es ausgeführt wurde. Z.B:

$ 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) Installieren Sie Drush auf Drupal, indem Sie ein Docker-Image erstellen (mithilfe einer Docker-Datei). Beispiel:

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) Verwenden Sie einen anderen Container mit drush und volume it zum Drupal-Container mithilfe der Docker-compose.yml. Beispiel:

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

Damit Drush effektiv arbeitet, sollten Sie es besser aus dem Container heraus ausführen, in dem Drupal ausgeführt wird. Fügen Sie dazu einen Einliner in Ihre Dockerfile hinzu.

# 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/

Für die tatsächliche Verwendung ist es besser, separate Drush-Aliasnamen für die Verwendung aus dem Container und vom Host zu versenden (über den öffentlichen Schlüssel SSH). Betrachten Sie als Beispiel diese Aliasnamen und betrachten Sie das gesamte Setup als Referenzimplementierung: https://github.com/srijanaravali/docker-blueprint/blob/master/docker-utils/drush/local.aliases.drushrc. php

Sie können diese Aliase in den Container transportieren, indem Sie Folgendes in Ihrer Docker-Datei enthalten:

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

oder - für die gemeinsame Steuerung mit dem Host können Sie in Betracht ziehen, dass es in Ihrem Docker-compose.yml als Volume angehängt ist.

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

Sie können jetzt Drush-Befehle für den Container wie folgt ausführen: docker exec drush @alias <command>. Sie können einen Alias ​​verwenden, der weniger tastaturintensiv ist, natürlich.

Oder Verwenden Sie drush von Ihrem Host, indem Sie stattdessen den von Ihnen gelieferten SSH-Alias ​​aufrufen - drush @alias-ssh <command>

4
p6.srijan

Ich habe viel zu viel Zeit damit verbracht, dies zu schaffen. Hier sind meine Erkenntnisse.

Wie bei OP habe ich nie das Drush-Image für das lokale Docker-Netzwerk erhalten, daher erschien es mir einfacher, Drush via Composer mit dem Drupal-Image zu bündeln (siehe Dockerfile unten). 

Das funktioniert etwas, wenn Sie exec in den Container ausführen, können Sie den Drush-Status ausführen, es wird jedoch keine Verbindung zum Mysql-Server hergestellt. Dafür gibt es zwei Gründe:

  1. Das Paket mysql-client wird benötigt, um eine Remote-Verbindung zur Datenbank herzustellen (da wir dies in einem lokalen Docker-Netzwerk ausführen).

  2. Der MySQL-Hostname muss explizit in der Docker-Compose-Datei (oder dem Docker-Ausführungsbefehl) festgelegt werden.


Das ist meine 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/*

Die wichtigen Pakete sind curl (offensichtlich) und mysql-client.

Und das sind die relevanten Teile von 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:

Warum funktioniert das explizite Einstellen des Hostnamens?

Das zweite Problem ist besonders umständlich, da drush die Konfiguration von "settings.php" verwendet, um sich mit mysql zu verbinden. Die 'Host'-Taste im Datenbank-Array wird jedoch anscheinend unterschiedlich interpretiert, drupal und drush. Hier ist der relevante Abschnitt von 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',
    ),
  ),
);

Die auskommentierte Zeile hinter 'Host' => 'mysql' ist ein früherer Versuch aus einer anderen SO - Antwort und veranschaulicht das Problem. Drush verwendet die Befehlszeilen-Server-API, die sich von der von drupal verwendeten unterscheidet. Der alternative Hostname ist die Hash-ID des laufenden Containers, die durch Ausführen von SQL (z. B. von Phpmyadmin) gefunden werden kann: 

SHOW VARIABLES WHERE Variable_name = 'hostname' (genommen aus dies )

Dieser Wert ändert sich bei jeder Aktualisierung des Containers. Der Hostname wird daher explizit in docker-compose.yml angegeben (siehe oben).


Edit: Ich habe ein kleines Projekt zum Hosting einer Drupal + Drush + Phpmyadmin-Entwicklungsumgebung erstellt, die auf dieser basiert: https://github.com/glaux/drupal8docker

3
glaux

Eine der Lösungen für Drupal 8 - Docker - Drush-Combo ist:

  1. Schritt: Installieren des Drush in dem Image, auf dem sich der Apache-Server befindet, nennen wir dieses Docker-Image "php5".
  2. Schritt: Machen Sie einen Alias ​​in Ihrer ~/.bashrc-Datei wie folgt:

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

In diesem Alias ​​benutze ich den Docker-Composer, aber mit dem einfachen Docker ist es dasselbe. Sie können den Drush-Befehl auf dem php5-Image ausführen und angeben, wo sich Ihr Drush in Docker befindet und wo sich Ihre Codebase auf Docker befindet. Auf diese Weise benutzt du es einfach so:

dr5 cr

Für den Befehl zur Cache-Neuerstellung in Ihrem lokalen Codeverzeichnis.

1
Arnold PÉTER

Versuchen Sie etwas wie https://github.com/wodby/docker4drupal . Für mich ist es sehr nützlich und flexibel, Drupal mit Docker zu entwickeln.

0
DrHolera

Ich denke, Sie haben zwei Möglichkeiten: Sie können den drush/drush-Container separat ausführen und ein gemeinsam genutztes Speichervolume verwenden, damit er auf die Dateien zugreifen kann, die Drupal verwenden wird.

Oder Sie könnten ein neues Bild erstellen, das sowohl Drush als auch Drupal enthält. Siehe https://docs.docker.com/engine/userguide/containers/dockerimages/

Sie können die Dockerfile wahrscheinlich für das Drush-Image und das Drupal-Image als Anleitung verwenden.

0
dnephin

Was ich gewählt habe, ist zu installieren, es wird in meinem web-Container komponiert.

Zuerst installiere ich Composer und dann benötige ich Drush in dem Verzeichnis, das ich möchte.

Dockerfile-Beispiel:

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

Wenn Drush bereits eine Abhängigkeit innerhalb des composer.json Ihres Projekts ist, können Sie es einfach composer install.

0