Как использовать докер с drupal и drush?

Я хотел бы использовать drush. Он должен работать в контейнере drupal. Также существует drush docker repo. Но я не знаю, как сделать его доступным в контейнере drupal. Это мой первый докер и проект drupal, поэтому, возможно, я полностью ошибаюсь.

Как я могу использовать drush с этим догрунтовым изображением drupal? https://hub.docker.com/_/drupal/ Можно ли управлять им с помощью докеров? Может быть, расширение контейнера drupal?

Это мой 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"

Ответ 1

Как всегда в Docker, есть много вариантов использования drush. Но обратите внимание, что для того, чтобы у drush был доступ к базе данных (например, mysql), в Drupal должны быть тома из контейнера mysql, такие как:

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

Вот самые распространенные.

1) Смонтируйте свой локальный набор в контейнер 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) Создайте образ докера только для данных для drush и добавьте объем исполняемого файла в ваш контейнер Drupal. См. Пример по адресу https://github.com/RobLoach/drush-docker/issues/32#issuecomment-222321265.

3) Установите Drush в контейнер Drupal после его запуска. Например:

$ 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) Установите Drush на Drupal, создав образ Docker (используя Dockerfile). Пример:

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) Используйте другой контейнер с drush и добавьте его в контейнер Drupal, используя docker-compose.yml. Пример:

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

Ответ 2

Чтобы Drush работал эффективно - вам лучше запустить его из контейнера с запущенным Drupal. Для этого добавьте один вкладыш в файл 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/

Для фактического использования вам лучше отправлять отдельные псевдонимы Drush для использования - как из контейнера, так и из хоста (через SSH открытого ключа). В качестве примера рассмотрим эти псевдонимы и рассмотрим всю установку как эталонную реализацию: https://github.com/srijanaravali/docker-blueprint/blob/master/docker-utils/drush/local.aliases.drushrc.php

Вы можете перенести эти псевдонимы в контейнер, имея что-то вроде этого в вашем файле Docker:

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

или - для совместного управления с хостом вы можете подумать о том, чтобы установить его в качестве тома в файле docker-compose.yml.

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

Теперь вы можете запускать команды Drush в контейнере следующим образом: docker exec drush @alias <command>. Вы можете bash псевдоним, чтобы быть чем-то менее интенсивным в клавиатуре, конечно.

Или, используйте drush с вашего хоста, вызывая вместо него псевдоним SSH - drush @alias-ssh <command>

Ответ 3

Я потратил слишком много времени, чтобы заставить это работать. Вот мои выводы.

Подобно OP, я никогда не получал drush-изображение для работы в локальной сети докеров, поэтому мне было проще скомбинировать drush через композитор с изображением drupal (см. Dockerfile ниже).

Это работает несколько, если вы выполните в контейнер, вы можете запустить drush-статус, но он не будет подключаться к серверу mysql. Для этого есть две причины:

  • Пакет mysql-client необходим для удаленного подключения к базе данных (поскольку мы запускаем это в локальной сети докеров).

  • Имя хоста mysql должно быть явно задано в файле docker-compose (или команде запуска docker).


Это мой файл Docker:

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

Важными пакетами являются curl (очевидно) и mysql-client.

И это соответствующие части 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:

Почему явная настройка имени хоста работает

Вторая проблема выше, особенно дьявольская, поскольку drush использует конфигурацию из settings.php для подключения к mysql. Но ключ "хозяин" в массиве баз данных интерпретируется по-разному bu drupal и drush. Вот соответствующий раздел из 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',
    ),
  ),
);

Отключенная строка после 'host' => 'mysql' - это предыдущая попытка, взятая из другого ответа SO и иллюстрирующая проблему, drush использует API-интерфейс командной строки, который отличается от того, что использует drupal. Альтернативное имя хоста - это хеш-идентификатор запущенного контейнера, который можно найти, запустив sql (например, из phpmyadmin):

SHOW VARIABLES WHERE Variable_name = 'hostname' (принятая форма this)

Это значение изменяется каждый раз, когда контейнер обновляется, поэтому для его сохранения имя хоста явно указано в docker-compose.yml, выше.


Изменить: я создал небольшой проект для размещения среды разработки drupal + drush + phpmyadmin на основе этого: https://github.com/glaux/drupal8docker

Ответ 4

Одно из решений для Drupal 8 - Docker - Drush комбо:

  • Шаг. Установка Drush на изображении, где у вас есть сервер Apache, позвоните на это изображение докеры "php5".
  • Шаг: создайте псевдоним в файле ~/.bashrc следующим образом:

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

В этом псевдониме я использую композитор Docker, но он тот же, что и простой Docker, вы запустили команду Drush на изображении php5, указав, где ваш drush находится в Docker и где ваша кодовая база находится на Docker. Таким образом вы просто используете его следующим образом:

dr5 cr

Для команды восстановления кэша в вашем локальном каталоге кода.

Ответ 5

Я думаю, что у вас есть два варианта: вы можете запускать контейнер drush/drush отдельно и использовать общий объем хранения, чтобы он имел доступ к файлам, которые будет использовать drupal.

Или вы можете создать новое изображение, содержащее как drush, так и drupal. См. https://docs.docker.com/engine/userguide/containers/dockerimages/

Возможно, вы можете использовать Dockerfile для изображения drush и изображения drupal в качестве руководства.

Ответ 6

Что я решил сделать, так это установить его в свой web контейнер.

Сначала я устанавливаю composer, а затем мне требуется Drush в нужном мне каталоге.

Пример 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

Если Drush уже является зависимостью в composer.json вашего проекта, вы можете просто composer install его.

Ответ 7

Попробуйте что-то вроде https://github.com/wodby/docker4drupal. Для меня это очень полезная и гибкая вещь для разработки Drupal с Docker.