Closed20

Emscripten が動く Docker イメージを Buildpack で作成する

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

このスクラップについて

このスクラップでは Empscripten が動く Docker イメージを Buildpack で作成し、Cloud Run で実行するまでの過程を記録する。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

現状のやり方

現状では 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 を使いたい。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

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
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

削除するもの

Git は emsdk をダウンロードするためだけに必要なので使い終わったら削除しても良さそう。

ダウンロードした emsdk も使い終わった後は削除しても良さそう。

Python3 は emcc が依存している様子なので残しておいた方が良さそう。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

追加 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 も必要でした。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

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 --from=builder /home/cnb/emsdk/.emscripten /home/cnb/emsdk/.emscripten
COPY --from=builder /home/cnb/emsdk/node /home/cnb/emsdk/node
COPY --from=builder /home/cnb/emsdk/upstream /home/cnb/emsdk/upstream
ENV PATH $PATH:/home/cnb/emsdk/upstream/emscripten
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

確認

コマンド
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.
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

プッシュ

コマンド
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
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

デプロイ

コマンド
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
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

おわりに

動作確認の手順や結果を大幅に端折ってしまっているが無事に完了することができた。

Cloud Run で実行イメージをカスタマイズする方法がわかって良かった。

下記 GitHub ページが参考になった。

https://github.com/GoogleCloudPlatform/buildpacks/blob/main/builders/gcp/base/google.22.builder.toml

できれば Cloud Build でビルドも実行したい。

機会があれば調べてみよう。

このスクラップは2023/07/22にクローズされました