GAE(nodejs|FE)でデプロイ中にbuildを含める方法
仕事でGAE Flexible EnvironmentにNodejsのアプリケーションをホスティングしています。その際、デフォルトの設定だとnpm install --production
が実行されるのでdevDependenciesのインストールはスキップされることに困っていました。
ちょっと前まで手元でビルドしてgcloud app deploy
を叩いており、さすがにイケてないなと思っていましたが、ついに解決しました。
まとめ
以下のようにgcp-build
をnpm scriptとして定義してあげるとデプロイ中にnpm run gcp-build
を行ってくれます。
{
"scripts": {
"build": "NODE_ENV=production webpack",
"gcp-build": "npm run build"
}
}
該当のDockerfile
nodejs-docker/Dockerfile.txt · GoogleCloudPlatform/nodejs-docker でhasBuildCommand
がtrueだとnpm run gcp-build
を実行してくれる。
nodejs-docker/detect_setup.ts でpackgeJson.scripts
にgcp-build
が定義されていればhasBuildCommand
がtrueになる。
nodejs-dockerリポジトリ
gcloud app deploy
を実行すると、Container Builderでイメージのビルドが行われている。nodejs-dockerはそのビルドに使われるDockerfileを保持するリポジトリ。
RailsもGCPで運用しており、GoogleCloudPlatform/ruby-dockerにDockerfileがあってトラブルがあったときはよくお世話になっています。
自前のDockerfileを使用する手もある
gcloud beta app gen-config --custom
でDockerfile
を吐き出してくれて、app.yaml
のruntime: custom
とすることで自分が作っているDockerfileを見てくれる。
あまりスタンダードなデプロイから離れたくなかったので今回の標準的な方法(?)を採用した。ただ、将来的にはGKEでk8sを動かす気がするのでDockerfileは自分で書くことになりそう。
正直ビルドプロセスをおまかせしたいからApp Engineを使っているのに、なんでソースコード見ることになるのか…