如何使用drupal和drush的docker?

时间:2016-03-02 09:57:56

标签: drupal docker docker-compose drupal-8 drush

我想使用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"

8 个答案:

答案 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服务器。这有两个原因:

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

  2. 需要在docker-compose文件(或docker run命令)中显式设置mysql主机名。

  3. 这是我的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组合是:

  1. 步骤:在拥有Apache服务器的映像中安装Drush,让我们调用此docker映像&#39; php5&#39;。
  2. 步骤:在〜/ .bashrc文件中创建一个别名,如下所示:

    alias dr5='docker-compose run php5 /root/.composer/vendor/bin/drush --root=/var/www/html/docroot';
    
  3. 在这个别名中我使用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