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
(ドットセバレートバリュー)としている。