色々試行錯誤して、自前のDocker環境でDuskを起動することができたのでその時のメモです。
基本的なインストール方法は公式をみてもらうとして、それ以外のアンドキュメンテっとな部分についてのみ記載します。
環境設定ファイル
ルートに .env.dusk.local を作ります。
すでにunittestを使っているのであれば、.env.testing があるはずなのでそれをコピーしてください。
その上で、以下の設定を追記、変更します。
APP_ENV=testing
APP_URL=http://host.docker.internal:8000
DUSK_DRIVER_URL=http://selenium:4444/wd/hub
APP_ENV=testing がないと普段使っているDBが削除されてしまうので注意!
念の為DBのバックアップをとっておきましょう。
APP_URLについて
これは、コンテナのブラウザがWebアプリにアクセスするためのURLですが、コンテナ内部からアクセスできる必要があります。
ローカルで動かしているのであれば、普段ブラウザでみているURLを書けばOKです。
私は、localhost:8000 でアクセスするよう設定しているので、そう書きたいところなのですが、コンテナ内からの参照可能なURLを書く必要があるためlocalhostは使えません。
http://Webサーバーコンテナ名:ポート番号
でもいいはずなんですが、なぜかうまくいかなかったためhost.docker.internal でコンテナ内部からホストにアクセスできる様にdocker-compose.yml を書き換えました。
(webサーバーのコンテナ):
extra_hosts:
- 'host.docker.internal:host-gateway'
DUSK_DRIVER_URL について
ブラウザの接続先の設定になります。
今回は、selenium を使うことにしたため、DUSK_DRIVER_URLを書き換えました。sailがseleniumを使っていたのでこちらにしました。Chromeを使うのであれば不要なはずです。
セレニウムコンテナは以下の様に記載しています。
selenium:
# Windows/Linux/IntelMac
image: 'selenium/standalone-chrome'
# for apple silicon
# image: 'seleniarm/standalone-chromium' # M1/M2のMacの方はこちらじゃないと動きません。
volumes:
- '/dev/shm:/dev/shm'
extra_hosts:
- 'host.docker.internal:host-gateway'
networks:
- local-network # ご自身の環境似合わせてください
その他
ちなみに、duskの.envファイルがかなり曲者です。
duskを起動するともとの、.env ファイルが.env.backup にリネームされます。
.env.dusk.local が.env で複製されてテストが実行。.env.backup が.env に戻ります。
かなりUNKな実装です。
なぜこれがダメかというと、なんらかの原因でテストを強制終了した場合に.env がdusk用の設定のままになってしまうので、開発環境が動かなくなってしまいます。
unittestの方は別で動くので問題ないのですが、こちらと同様のしくみにしてほしいところです。