如何使用docker与Drupal和淹死?

我想用drush 。 它需要在Drupal容器中运行。 还有一个呕吐docker回购 。 但我不知道如何使它在drupal容器中可用。 这是我的第一个docker和drupal项目,所以也许我完全错了。

我该如何使用这个drupal docker镜像来使用drush? https://hub.docker.com/_/drupal/是否可以用docker-compose来pipe理它? 也许扩展的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" 

和Docker一样,使用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)创build一个数据唯一泊坞窗图像为drush和卷可执行文件到您的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)通过创buildDocker镜像 (使用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)使用另一个容器与drush容量使用docker-compose.yml的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 

为了使Drush有效地工作 – 你最好在运行Drupal的容器内运行它。 为此,在您的Dockerfile中添加一个class轮。

 # 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 @alias-ssh <command>

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

就像OP一样,我从来没有在本地的dockernetworking上得到这个drush镜像,所以我觉得通过composer将drush和drupal镜像捆绑在一起看起来更简单(见下面的Dockerfile)。

这有些作用,如果你进入容器,你可以运行drush状态,但不会连接到mysql服务器。 有两个原因:

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

  2. 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中的configuration连接到mysql。 但是数据库数组中的“主机”键被解释为不同的bu drupal和显然。 这是来自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'之后'host' => 'mysql'注释行是以前尝试从另一个SO答案取得的,并说明问题,drush使用与drupal使用的不同的命令行服务器API。 备用主机名是正在运行的容器的哈希ID,可以通过运行sql(例如,来自phpmyadmin)find:

SHOW VARIABLES WHERE Variable_name = 'hostname' (采取这种forms)

这个值在每次容器更新时都会改变,所以为了使它保持docker-compose.yml ,主机名在docker-compose.yml明确声明,如上所述。


编辑:我做了一个小项目,主持一个drupal + drush + phpmyadmin开发环境的基础上: https : //github.com/glaux/drupal8docker

我认为你有两个select,你可以单独运行drush/drush容器,并使用一个共享保持卷,以便访问drupal将要使用的文件。

或者你可以build立一个包含drush和drupal的新图像。 见https://docs.docker.com/engine/userguide/containers/dockerimages/

您可以使用Dockerfile作为指导,将drush映像和drupal映像用作指导。

Drupal 8 – Docker – Drush组合的解决scheme之一是:

  1. 第一步:在拥有Apache服务器的映像中安装Drush,让我们调用这个docker映像“php5”。
  2. 步骤:在你的〜/ .bashrc文件中创build一个别名,如下所示:

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

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

 dr5 cr 

对于caching重build命令,在本地代码目录中。