如何在Drupal和Drush中使用Docker?

7uzetpgm  于 2023-10-16  发布在  Docker
关注(0)|答案(9)|浏览(113)

我想使用drush。它需要在Drupal容器中运行。还有一个drush docker repo。但我不知道如何让它在Drupal容器中可用。这是我的第一个Docker和Drupal项目,所以也许我完全搞错了。
如何使用Drush和这个Drupal Docker镜像?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"
zzoitvuj

zzoitvuj1#

我花了太多时间让它工作。以下是我的发现。
像OP一样,我从来没有让drush镜像在本地Docker网络上工作,所以对我来说,通过composer将drush与drupal镜像捆绑在一起似乎更简单(参见下面的Dockerfile)。
这在某种程度上是可行的,如果你在容器中执行,你可以运行drush status,但它不会连接到mysql服务器。这有两个原因:
1.需要mysql-client包来远程连接数据库(因为我们在本地Docker网络上运行它)。

  1. mysql主机名需要在docker-compose文件(或docker run命令)中显式设置。
    这是我的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。但是数据库数组中的“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',//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使用的不同。备用主机名是正在运行的容器的哈希ID,可以通过运行sql(例如从phpmyadmin)找到:
SHOW VARIABLES WHERE Variable_name = 'hostname'(取自this
这个值在容器每次更新时都会改变,所以为了使它持久化,主机名在上面的docker-compose.yml,se中显式声明。
编辑:我做了一个小项目来托管一个drupal + drush + phpmyadmin开发环境,基于这个:https://github.com/glaux/drupal8docker

zi8p0yeb

zi8p0yeb2#

与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)将本地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)创建一个data only docker image for drush并将可执行文件卷到您的Drupal容器中。参见www.example.com上的示例https://github.com/RobLoach/drush-docker/issues/32#issuecomment-222321265。
3)在Drupal容器运行后安装Drush。例如:

$ 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将another container与drushvolume it合并到Drupal container中。范例:

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
holgip5t

holgip5t3#

为了使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/

对于实际使用,您最好从容器和主机(通过公钥SSH)中提供单独的Drush别名供使用。作为一个示例,查看这些别名并将整个设置视为参考实现: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 @alias-ssh <command>,从您的主机使用drush

pcww981p

pcww981p4#

Drupal 8 - Docker - Drush组合的解决方案之一是:
1.步骤:将Drush安装在Apache服务器的镜像中,让我们将这个Docker镜像称为“php5”。
1.步骤:在~/.bashrc文件中创建一个别名,如下所示:

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

在这个别名中,我使用Docker composer,但它与简单的Docker相同,您在php5镜像上运行Drush命令,指定Drush在Docker中的位置以及代码库在Docker中的位置。这样你就可以像这样使用它:

dr5 cr

对于该高速缓存rebuild命令,在本地代码目录中。

pxy2qtax

pxy2qtax5#

试试https://github.com/wodby/docker4drupal。对我来说,用Docker开发Drupal是非常有用和灵活的。

nukf8bse

nukf8bse6#

我认为你有两个选择,你可以单独运行drush/drush容器,并使用一个共享的保持卷,这样它就可以访问drupal将要使用的文件。
或者你可以构建一个包含drush和drupal的新图像。参见https://docs.docker.com/engine/userguide/containers/dockerimages/
您可以使用Dockerfile作为drush图像和drupal图像的指导。

wfsdck30

wfsdck307#

我选择做的是将它安装到我的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它。

e5njpo68

e5njpo688#

最好的选择是基于你的实际容器创建你自己的镜像,包括你想要的所有更改,比如drush,nano,Vim等,并将它们推送到你自己的docker repo中。要做到这一点,请遵循以下步骤:https://www.scalyr.com/blog/create-docker-image/https://ropenscilabs.github.io/r-docker-tutorial/04-Dockerhub.html

cig3rfwq

cig3rfwq9#

将Docker与Drupal和Drush一起使用是建立、管理和开发Drupal项目的有效方法。Docker允许您为Drupal环境创建隔离的容器,从而可以轻松复制和共享开发环境。以下是关于如何将Docker与Drupal和Drush一起使用的分步指南:

1.安装Docker:

  • 如果你还没有,在你的系统上安装Docker。您可以在Docker官方网站(https://docs.docker.com/get-docker/)上找到安装说明。
    2.创建Docker Compose文件:
  • Docker Compose是定义和运行多容器Docker应用程序的工具。在Drupal项目目录中创建一个docker-compose.yml文件,其结构如下:
version: '3'
services:
  drupal:
    image: drupal:latest
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: drupal
      MYSQL_USER: drupal
      MYSQL_PASSWORD: drupal
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: drupal
      MYSQL_USER: drupal
      MYSQL_PASSWORD: drupal

这个docker-compose.yml文件定义了两个服务:一个用于Drupal,一个用于MySQL。它为Drupal示例设置必要的环境变量和卷。

3.启动容器:

  • 运行以下命令启动Docker容器:
docker-compose up -d

此命令将在后台创建并运行Drupal和MySQL容器。

4.访问Drupal站点:

  • 打开Web浏览器并导航到http://localhost:8080。您应该看到Drupal安装页面。
    5.完整安装Drupal:
  • 按照屏幕上的说明完成Drupal安装。使用docker-compose.yml文件中定义的MySQL数据库凭据。
    6.安装Drush:
  • 您可以在Drupal容器中安装Drush。使用以下命令访问Drupal容器的shell:
docker-compose exec drupal bash

然后,在容器内安装Drush:

composer require drush/drush

7.使用Drush:

  • 安装Drush后,您现在可以使用它从容器中管理Drupal站点。例如,您可以运行Drush命令来更新模块、导入配置和执行各种站点管理任务。
    8.停止并移除容器:
  • 当你完成Drupal环境的工作时,你可以通过运行以下命令停止并删除Docker容器:
docker-compose down

这将停止并删除容器,但存储在./app目录中的应用程序数据将保留。
通过遵循这些步骤,您可以为Drupal设置一个基于Docker的开发环境,使您能够有效地处理Drupal项目并促进与他人的协作。Docker的隔离性和可移植性使其成为管理Drupal站点及其依赖项的强大工具。

相关问题