我花了太多时间让它正常工作。以下是我的研究结果。
像OP一样,我从未将drush镜像工作在本地docker网络上,因此对我来说,通过composer捆绑drush与drupal镜像更简单(请参见下面的Dockerfile)。
这在某种程度上可以工作,如果您进入容器,可以运行drush status,但它无法连接到mysql服务器,原因有两个:
需要安装mysql-client软件包以远程连接到数据库(由于我们正在本地docker网络上运行)。
必须在docker-compose文件(或docker run命令)中明确设置mysql主机名。
以下是我的Dockerfile:
FROM drupal:8.3.7-apache
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
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
RUN composer global require drush/drush && \
composer global update
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。但是数据库数组中的“host”键被Drupal和Drush显然以不同的方式解释。以下是从settings.php
中相关的部分:
$databases = array (
'default' => array (
'default' => array (
'database' => $envs['MYSQL_DATABASE'] ?? '',
'username' => $envs['MYSQL_USER'] ?? '',
'password' => $envs['MYSQL_PASSWORD'] ?? '',
'host' => '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使用的不同。备用主机名是运行容器的哈希ID,可以通过运行sql(例如来自phpmyadmin)找到:
SHOW VARIABLES WHERE Variable_name = 'hostname'
(来自这里)
每次更新容器时,此值都会更改,因此为了使其持久化,主机名在docker-compose.yml
中明确声明,如上所述。
编辑:我创建了一个小项目,用于基于此托管drupal + drush + phpmyadmin开发环境:https://github.com/glaux/drupal8docker