Docker multi-stage builds


1 min read
Docker multi-stage builds

Docker 17.05から、新機能としてmulti-stage buildsというものが導入されました。
これは、コンテナイメージをより最適化するために有用な機能で、Dockerfileからコンテナイメージをビルドする際にビルド依存のライブラリ/環境とランタイム依存のライブラリ/環境を切り分けることができる機能です。

具体例を見てみましょう。
Go言語で書かれた何らかのアプリケーションをコンテナ上で動かすことを考えます。
以前までであれば、以下のような二つのDockerfileを用いて作成します。

まずはビルド用Dockerfileです

FROM golang:1.7.3
WORKDIR /go/src/github.com/someone/foo/
COPY app.go .
RUN GOOS=linux go build -a -o app .

つぎに、実行用のDockerfileです。

FROM busybox:latest
WORKDIR /root/
COPY app .
CMD ["./app"]

このようにすることで、ビルド時にはGo言語のビルド環境が入ったコンテナを、実行時は(Go言語環境は不要なので)busyboxコンテナを使用することで、実行イメージを小さく抑えることができます。
しかし、このように二つのDockerfileを使用する場合、コンテナイメージのビルド手順が煩雑になる、複数ファイルのため管理しにくいなどの問題がありました。

multi-stage buildsを実装されたことで、以下のようにDockerfileを一つにまとめることができます。

FROM golang:1.7.3 AS build
WORKDIR /go/src/github.com/someone/foo/
COPY app.go .
RUN GOOS=linux go build -a -o app .

FROM busybox:latest
WORKDIR /root/
COPY --from=build /go/src/github.com/someone/foo/app .
CMD ["./app"]

一行目のAS build、九行目の--from=buildがポイントです。

AS hogeを使用することで、ビルドステージに名前をつけることができます。
加えて、COPY--from=hogeの形で名称を指定することで、ビルドステージから直接ファイルをコピーしてくることができます。
これまでは一旦ホストにファイルを取り出してから再度コピーするという形だったので、かなり手間が省けると言えるでしょう。

golangイメージの中でも小さい、golang:alpinebusyboxイメージでは、イメージサイズが200倍以上違うため、これは重要なアップデートと考えられます。


Go1.9rc1 is released!
Previous article

Go1.9rc1 is released!

Go1.9rc1がリリースされました! そこで、Go1.9のリリースノートをさらっと見てみようと思います。 (まだrc1なので、今後変更される場合があります。ご注意を) 全部見ていくと、結構な量になりそうなので、すぐに影響のありそうな部分だけ、軽く見ていきましょう。 type alias Go1.9ではType Aliasというものが導入されます。 これはその名の通り、型に別名をつけられるというもの。 言葉で説明するより、コードを見た方が早いと思いますので、コードを用意しました。 package main import

docker-machineでRancherOSを使う
Next article

docker-machineでRancherOSを使う

docker-machineとそのメリット docker-machineは仮想マシン上にDocker Engineをインストールするツールです。 docker-machineコマンドを使用することで、Dockerホストを作成・管理することが可能です。 docker-machineを使用してDockerホストを作成すると、 $ docker-machine env <MACHINE_NAME> でシェル評価可能なDocker接続情報を得ることができ、 $ eval $(docker-machine env <MACHINE_NAME>) とすることにより、そのセッション内ではあたかもローカル環境のDockerの様にコンテナを操作することが可能となります。 docker-machineで使用するOS 扨、


GO TOP

🎉 You've successfully subscribed to something tech.!
OK