如何使用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服务器。 有两个原因:
-
mysql-client包需要远程连接数据库(因为我们在本地dockernetworking上运行)。
-
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之一是:
- 第一步:在拥有Apache服务器的映像中安装Drush,让我们调用这个docker映像“php5”。
-
步骤:在你的〜/ .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命令,在本地代码目录中。