Otimizando imagens docker com multi-stage builds
BIANCA ROSA
tech lead @ stone
Vamos começar a usar Docker!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289039/Screenshot_from_2020-04-23_12-22-32.png)
FROM golang:1.14
RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
WORKDIR /go/src/app
COPY . .
RUN dep ensure
RUN go build -o app-bin .
ENTRYPOINT ["./app-bin"]
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289154/Screenshot_from_2020-04-23_12-59-44.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289070/Screenshot_from_2020-04-23_12-32-51.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289079/Screenshot_from_2020-04-23_12-35-57.png)
Você já parou pra notar quanto de espaço em disco suas imagens docker gastam?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289084/Screenshot_from_2020-04-23_12-15-56.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289083/Screenshot_from_2020-04-23_12-31-09.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289088/Screenshot_from_2020-04-23_12-37-33.png)
O que acontece no processo de build?
Código-fonte
Executável
Em linguagens compiladas, pra rodar a aplicação, você só precisa do código executável - e nada do que foi necessário pra gerar ele.
Multi-stage builds
FROM golang:1.14 as build
RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
WORKDIR /go/src/app
COPY . .
RUN dep ensure
RUN go build -o app-bin .
FROM scratch
COPY --from=build /go/src/app/app-bin ./
ENTRYPOINT ["./app-bin"]
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289299/Screenshot_from_2020-04-23_13-30-23.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289298/Screenshot_from_2020-04-23_13-31-31.png)
Ops, não funciona!
linkagem estática
vs
linkagem dinâmica
FROM golang:1.14 as build
RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
WORKDIR /go/src/app
COPY . .
RUN dep ensure
RUN CGO_ENABLED=0 go build -installsuffix nocgo -o app-bin .
FROM scratch
COPY --from=build /go/src/app/app-bin ./
ENTRYPOINT ["./app-bin"]
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289314/Screenshot_from_2020-04-23_13-35-31.png)
E o tamanho da imagem ó
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/7289331/Screenshot_from_2020-04-23_13-37-15.png)
Dá pra usar com quais linguagens?
- Fácil: build de front-end em JS
- Médio: linguagens que compilam pra código de máquina - Go, C, C++
- Difícil: Linguagens que compilam pra bytecode: Python, C#, Java
- Pro: Estratégias pra criar builds pipeline com testes, linters, etc
Links legais
Aviso: tutoriais de internet (e até palestras como essa) raramente vão te dar o melhor caminho pra uma imagem produtiva, isso é outro tópico
![](https://s3.amazonaws.com/media-p.slid.es/uploads/506119/images/6592756/yay.gif)
slides: biancarosa.com.br/talks
Otimizando imagens docker com multi-stage builds
By Bianca Rosa
Otimizando imagens docker com multi-stage builds
- 1,336