created: 2024-09-10T03:42:24.420Z

GCP で GAR に repo をつくりながら Cloud Run 上で puppeteer を動かす

GCP の Container Registry が deprecate になったり、 puppeteer で Chrome をインストールする仕様が変わったり、変化が激しいので何年かするとやりかたが変わる。このメモも 1 年後には役に立たなくなってるかもしれない。

Dockerfile

アプリは実装済みなので Dockerfile を書くところから。

# 公式のイメージ
# https://github.com/puppeteer/puppeteer/blob/main/docker/Dockerfile
FROM ghcr.io/puppeteer/puppeteer:latest

# 最初公式ドキュメントの通り `USER pptruser` としたが、GCP の cloud build の npm install で 権限エラーになる
# `USER pptruser` を外すとローカルのビルドで chrome の install で権限エラーになる
# こまめに権限を切り替えるのが正しいようだが、面倒なので root でやってしまう
USER root
WORKDIR /usr/src/app

COPY package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
CMD ["npm", "run", "start"]

USER は cloud build 上での権限管理がヒトクセあるようで小細工が必要だったけれども横着して root にしてしまった。Chromimu いろいろなことができちゃうので、仕事で動かすアプリは root で動かさないほうがいい。

つくった Dockerfile からビルドして動かしてみる

push する前に、つくったイメージが手元で動くのを確認しておく。

$ docker build -t scrape-giga-remains .
$ docker run -e DSV_CREDENTIAL=$DSV_CREDENTIAL -p 3000:3000 -it scrape-giga-remains

Google Artifact Registry

GCR は deprecated になっているので GAR を使う。

GCR と違って自分で入れ物(リポジトリ)をつくる必要がある。

gcloud artifacts repositories create $GCP_DOCKER_REPOS \
    --repository-format=docker \
    --location=$GCP_DEFAULT_REGION
gcloud artifacts repositories describe $GCP_DOCKER_REPOS \
    --location=$GCP_DEFAULT_REGION

本番で image をビルド

入れ物をつくったらビルド。

export SERVICE_IMAGE_TAG=${GCP_DEFAULT_REGION}-docker.pkg.dev/${GCP_PROJECT_ID}/${GCP_DOCKER_REPOS}/scrape-giga-remains
gcloud builds submit --tag $SERVICE_IMAGE_TAG

cloudrun にデプロイ

gcloud run deploy "$SERVICE_NAME" \
    --image "$SERVICE_IMAGE_TAG" \
    --set-env-vars "DSV_CREDENTIAL=$DSV_CREDENTIAL"

2 点コマンドライン上で確認が入るので答える。

  • region はどこにしますか?
  • アクセスに認証をかけますか?

その他

最初は DSV_CREDENTIAL 変数の中身は CSV だったのだが、カンマが --set-env-vars オプションにとって意味のある記号になっていて意図通り設定できなかったので DSV (ドットセバレートバリュー)としている。

古代ローマ人の24時間---よみがえる帝都ローマの民衆生活
[ad] 古代ローマ人の24時間---よみがえる帝都ローマの民衆生活
アルベルト・アンジェラ, 関口 英子 (単行本)