我想使用drush。它需要在drupal容器中运行。还有一个drush docker repo。但我不知道如何在drupal容器中使它可用。这是我的第一个码头和drupal项目,所以也许我的事情完全错了。
如何在这个drupal docker图像中使用drush? https://hub.docker.com/_/drupal/ 是否可以使用docker-compose进行管理?也许扩展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"
答案 0 :(得分:5)
与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)将 local drush 安装到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 创建一个仅数据的docker镜像,并将可执行文件卷到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)通过创建Docker镜像(使用Dockerfile)在Drupal上安装Drush。例如:
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)使用docker-compose.yml将另一个带有drush 的容器和 volume it 添加到Drupal容器中。例如:
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
答案 1 :(得分:5)
我花了太多时间让这个工作。以下是我的发现。
和OP一样,我从未让drush图像在本地docker网络上工作,因此通过composer将drush与drupal图像捆绑起来似乎更简单(参见下面的Dockerfile)。
这有点作用,如果你执行容器你可以运行drush状态,但它不会连接到mysql服务器。这有两个原因:
需要使用mysql-client软件包远程连接到数据库(因为我们在本地docker网络上运行它)。
需要在docker-compose文件(或docker run命令)中显式设置mysql主机名。
这是我的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/*
重要的套餐是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。但是主持人&#39;数据库数组中的键被解释为dr 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'
之后的out注释行是从另一个SO回答中获得的先前尝试并说明了问题,drush使用命令行服务器API,这与drupal使用的不同。备用主机名是正在运行的容器的哈希id,可以通过运行sql找到(例如来自phpmyadmin):
SHOW VARIABLES WHERE Variable_name = 'hostname'
(取自this)
每次更新容器时此值都会更改,因此要使其保持不变,主机名将在docker-compose.yml
中明确说明。
编辑:我已经做了一个小项目来主持drupal + drush + phpmyadmin开发环境,基于此:https://github.com/glaux/drupal8docker
答案 2 :(得分:4)
为了使Drush有效工作 - 最好在运行Drupal的容器中运行它。为此,在Dockerfile中添加一个衬垫。
# 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
您可以通过Dockerfile中的类似内容将这些别名传输到容器中:
# 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>
。你可以打击别名,因为它不是键盘密集的,当然。
或者,通过调用您发送的SSH别名来使用主机中的drush - drush @alias-ssh <command>
答案 3 :(得分:1)
Drupal 8的一个解决方案 - Docker - Drush组合是:
步骤:在〜/ .bashrc文件中创建一个别名,如下所示:
alias dr5='docker-compose run php5 /root/.composer/vendor/bin/drush --root=/var/www/html/docroot';
在这个别名中我使用Docker作曲家,但它与简单的Docker相同,你在php5图像上使用了Drush命令,指定你的drush在Docker中的位置以及你的代码库在Docker上的位置。 这样你只需使用它:
dr5 cr
对于cache rebuild命令,在本地代码目录中。
答案 4 :(得分:0)
我认为你有两个选择,你可以单独运行drush/drush
容器并使用共享保持卷,这样它就可以访问drupal将要使用的文件。
或者您可以构建一个包含drush和drupal的新图像。见https://docs.docker.com/engine/userguide/containers/dockerimages/
您可以使用Dockerfile作为drush图像和drupal图像作为指导。
答案 5 :(得分:0)
我选择做的是将其安装在我的web
容器中。
首先,我安装作曲家,然后在所需的目录中要求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
进行使用。
答案 6 :(得分:0)
尝试类似https://github.com/wodby/docker4drupal的操作。对我来说,用Docker开发Drupal是非常有用和灵活的事情。
答案 7 :(得分:0)
最好的选择是根据您的实际容器创建自己的映像,包括您想要的所有更改,例如drush,nano,vim等,并将其推送到您自己的docker存储库中。为此,请按照下列步骤操作: https://www.scalyr.com/blog/create-docker-image/ https://ropenscilabs.github.io/r-docker-tutorial/04-Dockerhub.html