LoginSignup
918
600

More than 5 years have passed since last update.

Docker multi stage buildで変わるDockerfileの常識

Last updated at Posted at 2017-04-18

Dockerイメージのサイズを1バイトでも削りたい皆さんに朗報です。

もうすぐリリースされるDocker 17.05でmulti stage buildという機能が導入される予定です。
こいつはこれまでのDockerfileの常識を覆す革新的な機能なのです。
Docker 17.05は本稿執筆時点では2017/05/03リリース予定となっており、現在はRC版が出てるので、気になる新機能を一足早くで試してみた。(2017/05/07追記:最終的に2017/05/04に正式リリースされました)

とりあえずこの新しいシンタックスのDockerfileを見てほしい。

FROM golang:alpine AS build-env
ADD . /work
WORKDIR /work
RUN go build -o hello main.go

FROM busybox
COPY --from=build-env /work/hello /usr/local/bin/hello
ENTRYPOINT ["/usr/local/bin/hello"]


FROM2


multi stage builddocker build



2017/04/19: FROM2()FROM COPY --from  AS17.05
docker/docker#31257 build: add multi-stage build support
docker/docker#32063 Add support for named build stages




Ubuntu16.04Docker 17.05 RC1
$ curl -fsSL https://test.docker.com/ | sh
$ docker version
Client:
 Version:      17.05.0-ce-rc1
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   2878a85
 Built:        Tue Apr 11 19:57:43 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce-rc1
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   2878a85
 Built:        Tue Apr 11 19:57:43 2017
 OS/Arch:      linux/amd64
 Experimental: false

サンプルとして適当なgolangのHello Worldを用意して、 main.go という名前で保存する。

main.go
package main

import "fmt"

func main() {
        fmt.Println("Hello World!")
}

本題のDockefileを作成する。

FROM golang:alpine AS build-env
ADD . /work
WORKDIR /work
RUN go build -o hello main.go

FROM busybox
COPY --from=build-env /work/hello /usr/local/bin/hello
ENTRYPOINT ["/usr/local/bin/hello"]


golang golang:alpine 使
FROM  AS  build-env 
go build golang hello 

2 busybox 使
2 COPY --from=build-env 1 hello 


$ docker build -t hello ./
Sending build context to Docker daemon  3.072kB
Step 1/7 : FROM golang:alpine AS build-env
 ---> c82f63bb2928
Step 2/7 : ADD . /work
 ---> 99dcd57710e1
Removing intermediate container c40285f497cf
Step 3/7 : WORKDIR /work
 ---> c467f9695c0c
Removing intermediate container e1cea9f53c34
Step 4/7 : RUN go build -o hello main.go
 ---> Running in ff0bd72ff9b7
 ---> db4ea63c9357
Removing intermediate container ff0bd72ff9b7
Step 5/7 : FROM busybox
 ---> 00f017a8c2a6
Step 6/7 : COPY --from=build-env /work/hello /usr/local/bin/hello
 ---> a058caaca167
Removing intermediate container 8781ac92ecdf
Step 7/7 : ENTRYPOINT /usr/local/bin/hello
 ---> Running in 8ceb1d1bd7c7
 ---> a2dd16706afc
Removing intermediate container 8ceb1d1bd7c7
Successfully built a2dd16706afc
Successfully tagged hello:latest

実行してみるとちゃんと実行できている。よさげ。

$ docker run -it --rm hello
Hello World!

イメージサイズを比べてみる。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              db4ea63c9357        15 seconds ago      258MB
hello               latest              a2dd16706afc        15 seconds ago      2.66MB
<none>              <none>              f1639e328e73        5 minutes ago       258MB
golang              alpine              c82f63bb2928        10 days ago         257MB
busybox             latest              00f017a8c2a6        5 weeks ago         1.11MB
alpine              latest              4a415e366388        6 weeks ago         3.99MB

使golang:alpine257MBbusybox1.11MBhello2.66MB


Dockerfile1使

 apt-get RUN1 && 



Happy docker building!!!
918
600
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

918
600