Docker環境でPlaywrightを導入する方法

既存のDocker環境にPlaywrightを導入する手順をご紹介します。ここでは、テスト対象のサーバーがRailsで動作しているケースを前提に進めていきます。

なぜDockerでPlaywrightを動かすのか?

1コンテナ1サービスの原則に従う場合、Playwrightサービスは別コンテナで動かすことが推奨されます。これにより、既存のDocker環境を汚さずに済み、Playwrightに必要な環境が既に整っている状態で導入が可能です。また、依存関係を分離することで、環境構築やメンテナンスがより簡単になります。

Playwright導入のためのコード

PlaywrightをDockerで実行するためには、公式で提供されているDockerイメージを利用します。以下はその具体的な手順です。

1. docker-compose.yml
 playwright:
  image: mcr.microsoft.com/playwright:v1.43.1-jammy
  command: sleep infinity
  volumes:
    - ../:/usr/src/app
  extra_hosts:
    - "host.docker.internal:host-gateway"   
詳細な解説
  • image: mcr.microsoft.com/playwright:v1.43.1-jammy
    Playwrightの特定のバージョン(v1.43.1)と、Ubuntu 22.04 JammyベースのDockerイメージを指定します。このイメージには、Playwrightの依存関係がすべて含まれています。
  • command: sleep infinity
    コンテナを無限に実行し続けるコマンドです。これにより、Playwrightのテスト実行時までコンテナを保持しておくことができます。
  • volumes:
    ../:/usr/src/app は、ホストマシンの親ディレクトリをコンテナ内の /usr/src/app にマウントします。これにより、ホスト上のテストコードをコンテナ内で参照できるようになります
  • extra_hosts:
    "host.docker.internal:host-gateway" は、コンテナ内からホストマシンにアクセスするための設定です。通常、コンテナ内の localhost はコンテナ自身を指すため、ホストマシン上で稼働しているサービス(例:Railsサーバー)に直接アクセスできません。
    この設定により、host.docker.internal というホスト名を host-gateway に解決し、コンテナからホストマシン上のサービスにアクセス可能にします。

host.docker.internalとは?

host.docker.internal は、Dockerが提供する特別なホスト名で、コンテナからホストマシンのIPアドレスに解決されます。主に開発環境で使用され、コンテナ内のアプリケーションがホストマシン上のサービス(例えば、ローカルのデータベースやAPIサーバー)にアクセスする際に役立ちます。

host-gatewayとは?

host-gateway は、Docker 20.10.0以降で導入された機能で、コンテナ内からホストマシンのネットワークゲートウェイにアクセスするための設定です。これにより、コンテナとホストの通信が可能になります。

2. Railsの設定変更

Railsアプリケーションがdevelopment環境で動作している場合、デフォルトでは接続可能なホスト名が制限されています。コンテナ内からホストマシンにアクセスするためには、host.docker.internal を許可する必要があります。

config/environments/development.rb

Rails.application.configure do
  # 他の設定...

  # Dockerコンテナ内からホストマシンにアクセスするためのホスト名を許可
  config.hosts << 'host.docker.internal'
end

Railsdevelopment環境では、default で Rails.application.config.hosts に下記の Host が登録されています。

これ以外のHost 名として接続しようとすると、ブロックされるため追加で host.docker.internal を含めることで、コンテナ内からホストマシンに接続できます。

まとめ

この手順に従うことで、RailsアプリケーションをDockerコンテナ内でPlaywrightと連携してテストする環境を簡単に構築できます。Dockerを活用することで、依存関係の分離や環境の再利用が容易になり、より柔軟で効率的な開発フローを実現できます。