💿
Playwrightを使ったスクレイピングがDockerで動かない
これはなに?
Dockerコンテナ上でPlaywrightを使ったスクレイピングをしたら少しハマったので、その時の対処方法です。
経緯
コード自体はローカルでは動いていたので、Dockerイメージをビルド。いざdocker run
したところ、エラーが出て動きませんでした。
エラーは以下
Failed to launch browser: Error: spawn ...chrome ENOENT
使用したイメージは
- node:16-alpine
コンテナに入って、CLIから実行しても、同じエラーが出てしまいます。
Alpine Linuxにapkで色々入れていけばイケけそう?ですが、、
apk update
apk add chromium
# などなど...
しかし「あぁ、chromeを入れ直せば良いのか」とパっとやった感じでは解決出来ませんでした。
これはさらなる沼にハマりそうな予感が。。
という事で、今回はサクッと諦めてシンプルにMicrosoft社が配布する公式イメージを利用して対応しました。
Playwright By Microsoft
このイメージを使うと
docker pull mcr.microsoft.com/playwright
👇こんな感じで、指定したページのスクショを簡単に撮ってくる事が出来ます。
docker run -it --rm -v [ホスト側の保存先を指定]:/captures mcr.microsoft.com/playwright:latest npx playwright screenshot --full-page zenn.dev ./captures/sample.png
yarnも最初から入っている様です。
docker run -it --rm mcr.microsoft.com/playwright:latest /bin/bash
# Container
yarn -v
1.22.17
node
node -v
v16.14.0
という事で、使用しているイメージを差し替えるだけで良さそうです。
(たった1行)書き換えたDockerfile
# FROM node:16-alpine
FROM mcr.microsoft.com/playwright
WORKDIR /usr/src/app
ENV TZ Asia/Tokyo
COPY . .
RUN yarn install --frozen-lockfile
RUN yarn build
ENTRYPOINT ["yarn"]
これでBuild&Runしたところ、無事に動きました🎉
デメリット
出来上がったイメージサイズが、alpineと比較してなんと1.5倍くらいになってしまいました。。🙀
これは要件によっては致命的になりうるので、その場合は自力でイメージを作る必要がありそうです。(やっぱりなんでもトレードオフ)
Discussion