Laravel Duskを自前のDocker経由で動かす

Laravelロゴ

色々試行錯誤して、自前の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の方は別で動くので問題ないのですが、こちらと同様のしくみにしてほしいところです。

タイトルとURLをコピーしました