Closed9

deno-puppeteerをalpine (Docker)で使いたかった

菊池紘菊池紘

Denoにポートされたpuppeteerがある。ここではこれをdeno-puppeteerと呼ぶことにする
https://github.com/lucacasonato/deno-puppeteer

これをalpineベースのコンテナイメージに突っ込んで、なるべく軽いイメージを作ろうとした。
できなかったので、いつかまた解決策が見つかった時のためにメモ。

菊池紘菊池紘

上記の例は面倒そうなので、Denoをalpineにセットアップしたイメージをベースにしてchromeをセットアップするのが良さそうと考えた。
alpineにDenoを入れたのはこちら
https://hub.docker.com/r/denoland/deno
tagでバージョンを固定してやると良い。

菊池紘菊池紘

しかしdeno-puppeteerはサポートしているchromeのリビジョンが決まっていて、それ以外のリビジョンのchromeは動作しないようになっている。
9.0.2時点では869685で、これはバージョン 91.0.4469.0 に相当。
apkでインストールできるchromeは以下の通り。合致するものがない。

apkのrepositoryのバージョン chromiumのバージョン
3.15 93.0.4577.82-r2
3.14 93.0.4577.82-r0
3.13 86.0.4240.111-r0
菊池紘菊池紘

deno-puppeteerにはchromeのインストーラーが付属していて、
https://github.com/lucacasonato/deno-puppeteer/tree/4d744407adbc23e66f6896ed7f1dc30b31725621#installation
ここに記載のある方法でインストールが可能。

この方法でインストールしてもchromeが起動しない。
必要そうなパッケージを足しまくっても起動しなかった。
(エラーログを紛失してしまったが、Segmentation faultだった)

菊池紘菊池紘

alplineを使うという縛りは外さないとして、解決方法として考えられるのは以下の方法

  1. deno-puppeteerをchromeの 93.0.4577.82-r2 など、apkからインストールできるバージョンに対応させる
  2. alpineで 91.0.4469.0 を動作させる方法を探す
  3. alpineで 91.0.4469.0 をソースからビルドする

1が一番簡単そうに見えてしまう。どんな障害が転がっているのかわからないけれど…
2は現状のまま突き進む道。今の自分の知識では難しそう。
3は開発環境とか作るのが大変そう。時間がある時にする感じかな…

菊池紘菊池紘

alpine縛りなしでいいならDebianを使う公式のサンプルがあるので、これを流用するのが一番早そう。
https://github.com/lucacasonato/deno-puppeteer/blob/4d744407adbc23e66f6896ed7f1dc30b31725621/Dockerfile

サンプルをビルドしたときのコンテナサイズは 727.26 MB だった。
alpineで試した時、一番大きく膨れたときが600MB代だったので、まあ許容範囲かもしれない。
alpine-chromeが400MB代だというのでできれば600MB代で抑えたいけど…

菊池紘菊池紘

distrolessというのを使うと軽くできるという話も見た
https://blog.inductor.me/entry/alpine-not-recommended

denoのdistroless版はこう作っているらしい
https://github.com/denoland/deno_docker/blob/main/distroless.dockerfile

どこか特定のディレクトリをコピーしてくれば良いのであればchromiumをインストールした後の増分をまるっとコピーしてくればいける…?
いや、その前に動作させられるのか?動作確認できるのか?

菊池紘菊池紘

クラスタを組めるのであれば、headless-chromeを別コンテナで立ち上げて置いてそこにconnectしに行くのでも良い。
VM一台の上でdocker-composeするので良ければそれが一番いいかな

このスクラップは2022/02/14にクローズされました