Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker マルチステージビルドで幸せコンテナライフ / Understanding docker's multi-stage builds

Docker マルチステージビルドで幸せコンテナライフ / Understanding docker's multi-stage builds

Docker v17.05 から導入された multi-stage builds 機能とは何か、どんな問題を解決するためのものなのかをまとめました.

Presented at Docker Tokyo.

Tori Hara
PRO

May 25, 2017
Tweet

More Decks by Tori Hara

Other Decks in Technology

Transcript

  1. SUPINF Inc. // twitter.com/toricls
    multi-stage builds
    Yasuhiro HARA
    May 23, 2017

    View Slide

  2. SUPINF Inc. // twitter.com/toricls
    multi-stage builds (v17.05~)

    View Slide

  3. SUPINF Inc. // twitter.com/toricls
    Multi-stage builds
    ୘ٵƛǷȏǭǗȗǪǑǝǬ೐Ɣ
    ǹDžLjȏƛƱƷ΂ƷŹƔźƸݮ੧

    View Slide

  4. SUPINF Inc. // twitter.com/toricls
    # Artifacts Builder
    FROM golang:1.8.2 AS builder
    WORKDIR /go/src/github.com/toricls/repos
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
    # Runner
    FROM scratch
    COPY --from=builder /go/src/github.com/toricls/repos/app /
    CMD ["/app"]
    multi-stage builds
    ./Dockerfile

    View Slide

  5. SUPINF Inc. // twitter.com/toricls
    # Artifacts Builder
    FROM golang:1.8.2 AS builder
    WORKDIR /go/src/github.com/toricls/repos
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
    # Runner
    FROM scratch
    COPY --from=builder /go/src/github.com/toricls/repos/app /
    CMD ["/app"]
    multi-stage builds
    1 Ƒƛ Dockerfile ˰ƘґϺƆƸ 2 ƑƛǷȏǭǗȗǪǑǝǬ

    View Slide

  6. SUPINF Inc. // twitter.com/toricls
    Multi-stage builds
    ୘ٵƛǷȏǭǗȗǪǑǝǬ೐ƛ
    ʓґ֕ƿ৤इƘ୴మƂƈƓżƹƸݮ੧

    View Slide

  7. SUPINF Inc. // twitter.com/toricls
    multi-stage builds
    https://www.slideshare.net/Docker/dockercon-2017-general-session-day-1-solomon-hykes-75362520

    View Slide

  8. SUPINF Inc. // twitter.com/toricls
    multi-stage builds
    Ɩƹżƶű౐ųƛ෇

    View Slide

  9. SUPINF Inc. // twitter.com/toricls
    FROM golang:1.8.2
    WORKDIR /go/src/github.com/toricls/repos
    RUN go get -d -v github.com/pkg/errors
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux go build -a
    -installsuffix cgo -o app .
    CMD ["./app"]
    Ɩƹżƶű۪̌ȥŹƷƛLjȅȜǜǙLjǞƘ౐űŹůƸŸ
    FROM golang:1.8.2 AS builder
    WORKDIR /go/src/github.com/toricls/repos
    RUN go get -d -v github.com/pkg/errors
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux go build -a
    -installsuffix cgo -o app .
    FROM scratch
    COPY --from=builder /go/src/github.com/
    toricls/repos/app /
    CMD ["/app"]
    ڰ఻ƘǷȏǭƄƌƱƑ multi-stage buildsƄƌƱƑ

    View Slide

  10. SUPINF Inc. // twitter.com/toricls
    FROM golang:1.8.2
    WORKDIR /go/src/github.com/toricls/repos
    RUN go get -d -v github.com/pkg/errors
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux go build -a
    -installsuffix cgo -o app .
    CMD ["./app"]
    Ɩƹżƶű۪̌ȥŹƷƛLjȅȜǜǙLjǞƘ౐űŹůƸŸ
    FROM golang:1.8.2 AS builder
    WORKDIR /go/src/github.com/toricls/repos
    RUN go get -d -v github.com/pkg/errors
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux go build -a
    -installsuffix cgo -o app .
    FROM scratch
    COPY --from=builder /go/src/github.com/
    toricls/repos/app /
    CMD ["/app"]
    ڰ఻ƘǷȏǭƄƌƱƑ multi-stage buildƄƌƱƑ
    + +

    View Slide

  11. SUPINF Inc. // twitter.com/toricls

    View Slide

  12. SUPINF Inc. // twitter.com/toricls
    multi-stage buildsɪ̣ƛɛൂƛњ೗ƛދΒ

    View Slide

  13. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸ̵̰ (~v17.03)

    View Slide

  14. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛ̵̰\T
    ▶︎ ǽȜǝLjȅȜǜƿ఍ಊƘƆƸ
    ▶︎ Alpine Linux, Scratch...
    ▶︎ ࡒ൜ƗƯƛƿऊż
    ▶︎ ޠΙű
    ▶︎ Ƿȏǭࣄƕҩ଻ࣄƔ̘ƛLjȅȜǜƿʎų

    View Slide

  15. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛ̵̰\T
    ▶︎ ǽȜǝLjȅȜǜƿ఍ಊƘƆƸ
    ▶︎ Alpine Linux, Scratch...
    ▶︎ ࡒ൜ƗƯƛƿऊż
    ▶︎ ޠΙű
    ▶︎ Ƿȏǭࣄƕҩ଻ࣄƔ̘ƛLjȅȜǜƿʎų
    ࡽƘƀƀƘ
    ߦŽƫƄṵ̵̋Ź

    View Slide

  16. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛ̵̰\T
    Builder Pattern

    View Slide

  17. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛ̵̰\T
    Builder Pattern - Golang -

    View Slide

  18. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛ̵̰\T SGJBCP.?RRCPL%MJ?LE
    FROM golang:1.8.2
    WORKDIR /go/src/github.com/toricls/repos
    RUN go get -d -v github.com/pkg/errors
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux \
    go build -a -installsuffix cgo -o app .
    FROM scratch
    COPY app /
    CMD ["/app"]
    ./Dockerfile.build ./Dockerfile (ҩ଻ࣄ)

    View Slide

  19. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛ̵̰\T SGJBCP.?RRCPL%MJ?LE
    `Builder pattern` ƛҩࢨƘƜGlueǗȜǭࣶƗƯƛŹքୟ
    #!/bin/sh
    #!/bin/sh
    # Builder
    docker build -t my-image:builder . -f Dockerfile.build
    #!/bin/sh
    # Builder
    docker build -t my-image:builder . -f Dockerfile.build
    # Extract artifacts
    docker create --name artifacts my-image:builder
    #!/bin/sh
    # Builder
    docker build -t my-image:builder . -f Dockerfile.build
    # Extract artifacts
    docker create --name artifacts my-image:builder
    docker cp artifacts:/go/src/github.com/toricls/repos/app ./app
    #!/bin/sh
    # Builder
    docker build -t my-image:builder . -f Dockerfile.build
    # Extract artifacts
    docker create --name artifacts my-image:builder
    docker cp artifacts:/go/src/github.com/toricls/repos/app ./app
    docker rm -f artifacts
    #!/bin/sh
    # Builder
    docker build -t my-image:builder . -f Dockerfile.build
    # Extract artifacts
    docker create --name artifacts my-image:builder
    docker cp artifacts:/go/src/github.com/toricls/repos/app ./app
    docker rm -f artifacts
    # Build runtime image
    docker build --no-cache -t my-image:latest . -f Dockerfile

    View Slide

  20. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛ̵̰\T
    GoƜǴLjǮȎ׼˥ƆƹƝűűƍƺųžƖ
    ɤƛ୭கƍƕƖųƄƓƌƛ෇

    View Slide

  21. SUPINF Inc. // twitter.com/toricls
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛƌƳƫƙ̵̰\T
    Builder Pattern - Ruby on Rails -

    View Slide

  22. SUPINF Inc. // twitter.com/toricls
    FROM ruby:2.4.1-alpine
    # Install Runtime Packages
    libxslt, yaml, postgresql-client ...
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛƌƳƫƙ̵̰\T SGJBCP.?RRCPL0S@WML0?GJQ
    ./Dockerfile.base
    ./Dockerfile.builder
    ./Dockerfile.base.builder
    ./Dockerfile (ҩ଻ࣄ)
    FROM my-base:latest
    # Install Development Packages
    libxslt-dev, yaml-dev, postgresql-dev ...
    FROM my-base:latest
    WORKDIR /app
    COPY . /app
    CMD ["bundle", "exec", "rails", "server"...
    FROM my-base-builder:latest
    # Install Gems, Compile Assets
    ...

    View Slide

  23. SUPINF Inc. // twitter.com/toricls
    FROM ruby:2.4.1-alpine
    # Install Runtime Packages
    ...
    FROM my-base:latest
    # Install Development Packages
    ...
    FROM my-base:latest
    WORKDIR /app
    COPY . /app
    CMD ["bundle", "exec", "rails", "server"...
    FROM my-base-builder:latest
    # Install Gems, Compile Assets
    ...
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿʊƸƌƮƛƌƳƫƙ̵̰\T SGJBCP.?RRCPL0S@WML0?GJQ
    ./Dockerfile.base
    ./Dockerfile.builder
    ./Dockerfile.base.builder
    ./Dockerfile

    View Slide

  24. SUPINF Inc. // twitter.com/toricls
    multi-stage builds

    View Slide

  25. SUPINF Inc. // twitter.com/toricls
    # Artifacts Builder
    FROM golang:1.8.2 AS builder
    WORKDIR /go/src/github.com/toricls/repos
    RUN go get -d -v github.com/pkg/errors
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
    # Runner
    FROM scratch
    COPY --from=builder /go/src/github.com/toricls/repos/app /
    CMD ["/app"]
    multi-stage builds
    ./Dockerfile

    View Slide

  26. SUPINF Inc. // twitter.com/toricls
    ƫƕƮ
    multi-stage builds ƿȥ׮Ƙ̙ࣄƄƓ
    ఍ಊƔࡒ൜ƛƗűLjȅȜǜƿ
    ɟƫƔƵƷƯݓƘ ׮Ƙ˥ƹƫƄƴų

    View Slide

  27. SUPINF Inc. // twitter.com/toricls
    References

    View Slide

  28. SUPINF Inc. // twitter.com/toricls
    References
    ▶︎ Use multi-stage builds - Docker Documentation
    ▶︎ https://docs.docker.com/engine/userguide/eng-image/multistage-build/
    ▶︎ Builder pattern vs. Multi-stage builds in Docker
    ▶︎ http://blog.alexellis.io/mutli-stage-docker-builds/

    View Slide


  29. SUPINF Inc. // twitter.com/toricls
    Thank you :)

    View Slide