crystal と node を使ったアプリの開発環境を準備しようとしたところ依存ライブラリが複雑で準備に時間がかかってしまいました。
そんな時、Docker multi stage build という方法が解決策になったので、ここにメモしたいと思います。
multi stage build とは
Docker の multi-stage builds は 17.05 以降で利用できるビルド方法で、一つの Dockerfile の中でビルド用イメージの作成とデプロイ用イメージを作成できます。ビルド用のイメージ中でプログラムをコンパイルし、実行ファイルだけをデプロイ用のイメージに取り込むことでデプロイ用のイメージサイズを減らすことができます。
マルチステージビルドの利用 — Docker-docs-ja 19.03 ドキュメント
使い方
multi-stage builds を利用すると、複数の FROM 命令を Dockerfile に記述できます。
この機能を使うことで、成果物だけ最終ステージに COPY すればよいため、build 用の中間イメージにおいては RUN をまとめる必要もなくなり可読性がアップします。
どう記述するかというと、それぞれの FROM 命令がステージとなる Docker イメージを表しており、AS を使って名前をつけられます。 名前をつけた Docker イメージからは COPY 命令を使ってファイルをコピーするといった感じです。
メリット
めんどくさいパッケージのインストールを考える必要がなくなる。
イメージサイズを小さくできる。
実際の設定
Dockerfile
今回は、crystal と nodejs を使った環境が欲しかったので、以下のように設定しました。
FROM node:12.22.10-alpine AS node FROM amberframework/amber:0.33.0 COPY --from=node /usr/local/bin/ /usr/local/bin/ COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules