Как использовать докер с 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 комбо:
В этом псевдониме я использую композитор 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.