DockerでLaravel5.4のDuskを実行する環境を整える

2017-02-20
Docker
PHP
Laravel

Laravel Duskの実行をコンテナ内のみで完結させたかったので試してみた。
dockerさえ動けばDuskの実行が可能になるので、環境構築が楽だしCIさせやすい。

サンプルコードは下記リポジトリを参照
https://github.com/hanhan1978/docker-laravel54-skelton

構成図

Docker Networks

  • NginxからPHP-FPMへリバースプロキシするシンプルな構成
  • PHP-FPMのコンテナからLaravel Duskを実行すると、Seleniumのコンテナへテストのリクエストを送信
  • Seleniumのサーバはテスト対象のWebアプリを参照するためにNginxのコンテナへリクエストを送信
  • 公式イメージのstandalone selenium webdriverを利用
  • docker-composeの設定はv2以上

docker-compose.ymlの中身

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '2'
services:
laravel:
build: .
volumes:
- ./laravel:/var/www/laravel
nginx:
image: nginx:1.11-alpine
ports:
- "80:80"
volumes:
- ./var/conf/default.conf:/etc/nginx/conf.d/default.conf
selenium:
image: selenium/standalone-chrome:latest

DuskTesetCase.phpの変更点

  • baseUrlをオーバーライドして変更。ここではDocker Networkのnginxを指定。
    1
    2
    3
    4
    protected function baseUrl()
    {
    return 'http://nginx';
    }
  • static::startChromeDriver() をコメントアウト。ローカルのchrome使わないので不要
    1
    2
    3
    4
    public static function prepare()
    {
    //static::startChromeDriver();
    }
  • seleniumの参照先をhttp://selenium:4444/wd/hub に変更。コレ大事。
    1
    2
    3
    4
    5
    6
    protected function driver()
    {
    return RemoteWebDriver::create(
    'http://selenium:4444/wd/hub', DesiredCapabilities::chrome()
    );
    }

テストの実行

コンテナ内で実行するのでexecを使う。
docker-compose exec laravel php artisan dusk

run test

まとめ

大変だったのは、selenium web driverのendpointが分かりづらかったくらい。docker-composeのlinkを使うと、循環参照エラーになってしまうのでv2以降の文法を使ってdocker networkから各コンテナを参照するのがポイント。