web-dev-qa-db-ja.com

drupalおよびdrushでdockerを使用する方法は?

drush を使用します。 drupalコンテナで実行する必要があります。 drush docker repo もあります。しかし、drupalコンテナ。これは私の最初のドッカーであり、drupalプロジェクトなので、完全に間違っているかもしれません。

このdrupal docker image)でdrushを使用するにはどうすればよいですか? https://hub.docker.com/_/drupal/ dockerで管理できますか?作成しますか?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"
18
citizen404

これを機能させるのに時間がかかりすぎました。これが私の発見です。

OPと同様に、drushイメージをローカルDockerネットワークで動作させることはなかったため、drushをcomposer with drupal image(see以下のDockerfile)。

これは多少機能します。コンテナで実行すると、drushステータスを実行できますが、mysqlサーバーに接続できません。これには2つの理由があります。

  1. パッケージmysql-clientは、データベースにリモートで接続するために必要です(これをローカルDockerネットワークで実行しているため)。

  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:

ホスト名を明示的に設定することが機能する理由

上記の2番目の問題は、Drushがsettings.phpの設定を使用してmysqlに接続するため、特に悪質です。しかし、databases配列の「Host」キーは異なる方法で解釈されますbu 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回答から取られた以前の試みであり、問​​題を示しています。他のdrupal使用代替ホスト名は、実行中のコンテナーのハッシュIDであり、sqlを実行することで見つけることができます(たとえば、phpmyadminから):

SHOW VARIABLES WHERE Variable_name = 'hostname'(形式 this

この値はコンテナが更新されるたびに変更されるため、永続化するために、ホスト名は上記のdocker-compose.ymlに明示的に記述されています。


編集:私はホストに小さなプロジェクトを作成しましたdrupal + drush + phpmyadmin開発環境これに基づいて: https://github.com/glaux/drupal8docker

8
glaux

いつものようにDockerでは、drushを使用するための多くのオプションがあります。ただし、drush to the access to the database(eg 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)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を使用して、Drupalコンテナーにdrushを含む別のコンテナーおよびvolume itを使用します。例:

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
5

Drushを効果的に動作させるには、Drupalを実行しているコンテナー内から実行するほうがよいでしょう。そのためには、Dockerfileに1つのライナーを追加します。

# 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>。もちろん、エイリアスをbashして、キーボードに負荷をかけずに済みます。

または、代わりに出荷したSSHエイリアスを呼び出して、ホストからdrushを使用します-drush @alias-ssh <command>

4
p6.srijan

https://github.com/wodby/docker4drupal のようなものを試してください。私にとっては、DockerでDrupalを開発することは非常に便利で柔軟なことです。

1
DrHolera

Drupal 8-Docker-Drushコンボのソリューションの1つは次のとおりです。

  1. ステップ:ApacheサーバーがあるイメージにDrushをインストールします。このDockerイメージを「php5」と呼びましょう。
  2. ステップ:〜/ .bashrcファイルに次のようにエイリアスを作成します:

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

このエイリアスではDocker composerを使用しますが、シンプルなDockerと同じです。DockerのどこにDrushがあり、Dockerのどこにコードベースがあるかを指定するphp5イメージでDrushコマンドを実行します。このようにして、次のように使用します。

dr5 cr

Cache rebuildコマンドの場合、ローカルコードディレクトリ。

1
Arnold PÉTER

2つのオプションがあると思います。drush/drushコンテナを個別に作成し、共有保留ボリュームを使用して、drupalが使用するファイルにアクセスできるようにします。

または、drushとdrupalの両方を含む新しいイメージを作成することもできます。 https://docs.docker.com/engine/userguide/containers/dockerimages/ を参照してください

おそらく、drushイメージのDockerfileとdrupalイメージをガイダンスとして使用できます。

0
dnephin

私が選択したのは、webコンテナにcomposerをインストールすることです。

まず、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 それ。

0