Closed20
Emscripten が動く Docker イメージを Buildpack で作成する
このスクラップについて
このスクラップでは Empscripten が動く Docker イメージを Buildpack で作成し、Cloud Run で実行するまでの過程を記録する。
関連スクラップ
現状のやり方
現状では Buildpack を使わずに下記の Docker ファイルを用意して対応している。
Dockerfile
FROM emscripten/emsdk
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
RUN npm prune --production
ENV PORT="3000"
ENV CORS_ORIGIN="http://example.com"
CMD [ "node", "dist/main" ]
できれば Buildpack を使いたい。
GCP Buildpack 公式ドキュメント
Emscripten 公式ドキュメント
実験用コンテナ起動
コマンド
docker run --rm -it -u root gcr.io/buildpacks/gcp/run /bin/bash
Emscripten インストール
コマンド(コンテナ)
# ホームディレクトリに移動します。
cd
# アップデートするとインストールができるようになります。
apt-get update
# git は emsdk をダウンロードするために必要です。
apt-get install git
# python3 は emsdk を実行するために必要です。
apt-get install python3
# emsdk をダウンロードします。
git clone https://github.com/emscripten-core/emsdk.git
# Emscripten をインストールします。
./emsdk install latest
# .emscripten ファイルを作成します。
./emsdk activate latest
# Emspcripten のPATH を追加します。
source ./emsdk_env.sh
削除するもの
Git は emsdk をダウンロードするためだけに必要なので使い終わったら削除しても良さそう。
ダウンロードした emsdk も使い終わった後は削除しても良さそう。
Python3 は emcc が依存している様子なので残しておいた方が良さそう。
追加 PATH
- /root/emsdk
- /root/emsdk/node/16.20.0_64bit/bin
- /root/emsdk/upstream/emscripten
一番下の /root/emsdk/upstream/emscripten だけがあれば良いのかな?
【追記】/root/emsdk/node/16.20.0_64bit/bin も必要でした。
Dockerfile
run.Dockerfile
FROM gcr.io/buildpacks/google-22/run AS builder
USER root
RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y python3
RUN apt-get install -y xz-utils
RUN apt-get install -y lbzip2
USER cnb
WORKDIR /home/cnb
RUN git clone https://github.com/emscripten-core/emsdk.git
RUN emsdk/emsdk install latest
RUN emsdk/emsdk activate latest
FROM gcr.io/buildpacks/google-22/run
USER root
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
USER cnb
COPY /home/cnb/emsdk/.emscripten /home/cnb/emsdk/.emscripten
COPY /home/cnb/emsdk/node /home/cnb/emsdk/node
COPY /home/cnb/emsdk/upstream /home/cnb/emsdk/upstream
ENV PATH $PATH:/home/cnb/emsdk/upstream/emscripten
ビルド
コマンド
docker build -t my-emscripten -f run.Dockerfile .
確認
コマンド
docker run --rm -it my-emscripten /bin/bash
コマンド(コンテナ)
emcc --version
コンソール出力
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.43 (a6b8143cf3c1171db911750359456b15a8deece7)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ビルド対象
Buildpack ビルド
コマンド
pack build nest-emcc-v2 \
--builder gcr.io/buildpacks/builder \
--run-image my-emscripten
参考になりそう
実行イメージの拡張
例では FROM gcr.io/buildpacks/gcp/run を基点としているが、実際には FROM gcr.io/buildpacks/google-22/run を基点としないと pack コマンド実行時にエラーとなる。
ローカル動作確認
コマンド
docker run --rm -p 8080:8080 nest-emcc-v2
プッシュ
コマンド
docker tag nest-emcc-v2 asia-northeast1-docker.pkg.dev/xxxx/cloud-run-source-deploy/nest-emcc-v2
docker push asia-northeast1-docker.pkg.dev/xxxx/cloud-run-source-deploy/nest-emcc-v2
デプロイ
コマンド
gcloud run deploy nest-emcc-v2 \
--platform managed \
--region asia-northeast1 \
--image asia-northeast1-docker.pkg.dev/xxxx/cloud-run-source-deploy/nest-emcc-v2
おわりに
動作確認の手順や結果を大幅に端折ってしまっているが無事に完了することができた。
Cloud Run で実行イメージをカスタマイズする方法がわかって良かった。
下記 GitHub ページが参考になった。
できれば Cloud Build でビルドも実行したい。
機会があれば調べてみよう。
このスクラップは2023/07/22にクローズされました