gpt4 book ai didi

drupal - 如何将docker与drupal和drush一起使用?

转载 作者:IT老高 更新时间:2023-10-28 12:41:05 28 4
gpt4 key购买 nike

我想使用 drush .它需要在 drupal 容器中运行。还有一个drush docker repo .但我不知道如何使它在 drupal 容器中可用。这是我的第一个 docker 和 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"

最佳答案

我花了太多时间来让它工作。这是我的发现。

像 OP 一样,我从来没有让 drush 镜像在本地 docker 网络上工作,所以对我来说,通过 composer 将 drush 与 drupal 镜像捆绑起来似乎更简单(参见下面的 Dockerfile)。

这有点工作,如果你执行到容器中,你可以运行 drush status,但它不会连接到 mysql 服务器。这有两个原因:

  1. 远程连接数据库需要 mysql-client 包(因为我们在本地 docker 网络上运行它)。

  2. 需要在 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。但是,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 使用与任何 drupal 不同的命令行服务器 API用途。备用主机名是正在运行的容器的哈希 id,可以通过运行 sql 找到(例如来自 phpmyadmin):

SHOW VARIABLES WHERE Variable_name = 'hostname'(采用 this 形式)

每次更新容器时此值都会更改,因此为了使其保持不变,主机名在 docker-compose.yml 中明确说明,请参见上文。


编辑:我做了一个小项目来托管一个基于此的drupal + drush + phpmyadmin开发环境:https://github.com/glaux/drupal8docker

关于drupal - 如何将docker与drupal和drush一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35743801/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com