Playwright のアプリをコンテナ化する

公開日 :

前回まで作ってきたアプリを簡単に展開できるように、Docker を利用してコンテナのイメージにしていきます。今回は実際の動作環境、および Docker ファイルを仕上げるところまで進めていきます。

各環境での動作確認

今回は3つの環境で、前回作成をしたアプリの動作確認をしていきます。前回の記事では、Windows では問題なく動作していました。また、macOS でも同じソースコードが動作するようになっています。

では実際に WSL で設定をした Ubuntu の環境で実行するとどうなるでしょうか?スクリーンショットを撮る際のブラウザをオープンするところで、以下のようにエラーが発生しています。

random desc

browserType.launch: 
╔══════════════════════════════════════════════════════╗
║ Host system is missing dependencies to run browsers. ║
║ Please install them with the following command:      ║
║                                                      ║
║     sudo npx playwright install-deps                 ║
║                                                      ║
║ Alternatively, use apt:                              ║
║     sudo apt-get install libnss3\                    ║
║         libnspr4\                                    ║
║         libatk1.0-0\                                 ║
║         libatk-bridge2.0-0\                          ║
║         libcups2\                                    ║
║         libxkbcommon0\                               ║
║         libatspi2.0-0\                               ║
║         libxcomposite1\                              ║
║         libxdamage1\                                 ║
║         libxfixes3\                                  ║
║         libxrandr2\                                  ║
║         libgbm1\                                     ║
║         libpango-1.0-0\                              ║
║         libcairo2\                                   ║
║         libasound2                                   ║
║                                                      ║
║ <3 Playwright Team                                   ║
╚══════════════════════════════════════════════════════╝

私が動かしている macOS および Windows では Chrome をブラウザとして利用できるようにしているのですが、WSL の Ubuntu の環境には必要なプログラムがインストールされていないため、このようなエラーが発生しています。上記のコマンドを実行すれば Linux でもこのプログラムは動作します。

とはいえ、せっかく便利な Docker があるのでこれを利用したいと思います。

Docker ファイルの準備

今回は Playwright が提供している公式のイメージ https://hub.docker.com/_/microsoft-playwright を利用して Docker ファイルを作成します。ファイルはシンプルに以下のようになります。

FROM --platform=linux/amd64 mcr.microsoft.com/playwright:v1.38.1-jammy

WORKDIR /usr/app
COPY . /usr/app

ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright

RUN cd /usr/app \ 
    && npm install \
    && npm run build

CMD ["npm","run","start"]

上記の Dockerfile のファイルのポイントは、2点あります。まず1つ目は、package.json に記載されている playwright のモジュールのバージョンと、上記のイメージのバージョンを合わせる必要があります。もう1つは、playwright 利用するイメージには /ms-playwright に必要なモジュールがすでに展開されているため、Path を指定する形で動作します。

同じ階層に、.dockerignore のファイルを置いて、以下の1行を記載してください。

plaintext node_modules

これで準備ができました。まずイメージの部分ですが、今回は platform を指定しています。これは私の手元のマシンに macOS が含まれているため、その際も amd64 を利用するように指定したいためです。これを抜きに build した場合、以下のように arm64 で build されます。

    "Architecture": "arm64",
    "Os": "linux",
    "Size": 2482189818,

プラットフォームを指定しておくことで、Windows 、Linux および macOS でも動作する linux - amd64 のイメージがビルドされる形です。まず今回は macOS で実行するため、以下のようにイメージの名前(imagenameは変更してください)を指定して実行します。

docker run --platform linux/amd64 -p 3000:3000 imagename

これでコンテナで動作しました。

random desc

Windows や Linux の環境においては、--platform linux/amd64 の部分を省略してコンテナを起動することができます(記載されていても問題なく動作しますが)。Ubuntu の環境に対してモジュールをインストールすることなく、Docker のイメージを利用してコンテナを起動することで、プログラムを起動することができました。

まとめ

今回はコンテナを利用して、どの環境でも動作するスクリーンショットのアプリを動かすイメージの作成をしました。次回は、環境変数を設定して、今後追加する複数のプログラムを含めたプロジェクトにするべく、プロジェクト全体をいじっていきます。