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();
}
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から各コンテナを参照するのがポイント。