freeCodeCamp/guide/portuguese/docker/separate-build-image/index.md

81 lines
2.5 KiB
Markdown

---
title: Separate Build Image
localeTitle: Imagem de compilação separada
---
## Visão geral
Fazer imagens docker leves é fundamental para ter um pipeline de desenvolvimento / implementação rápido. Para código compilado, construir o binário dentro de um contêiner docker tem o benefício de ser um processo de compilação repetido e padronizado. No entanto, isso pode criar imagens muito grandes que podem se tornar um problema no final da linha.
## Nosso código
Neste exemplo, usaremos um simples servidor web escrito em [Go](https://golang.org/) . O código a seguir é apenas um simples hello world webserver escutando na porta `8080` .
```go
package main
import (
"fmt"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello world!")
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
### Dockerfile
O Dockerfile para este código pode ser algo parecido com isto
```
FROM golang:1.11
ADD . /app
WORKDIR /app
RUN go build -o /myserver .
EXPOSE 8080
CMD [ "/myserver" ]
```
Construir esta imagem resulta em uma imagem com um tamanho de 783MB !! Com uma imagem desse tamanho para um aplicativo simples, é fácil ver como isso pode atrasar as coisas ao implantar.
## Uma solução melhor
Uma solução melhor seria usar uma imagem de construção separada para construir o binário e copiá-lo para a imagem final. Como Go gera um binário autônomo, podemos usar o `scratch` imagem janela de encaixe como uma base que é quase tão pequeno quanto ele ganha!
### Dockerfile
O Dockerfile a seguir irá primeiro construir o binário dentro da imagem do golang e então construir uma nova imagem a partir do zero, copiando o binário da primeira imagem para a segunda.
```
FROM golang:1.11 as build
ADD . /app
WORKDIR /app
RUN go build -o /myserver .
FROM scratch
COPY --from=build /myserver /myserver
EXPOSE 8080
CMD [ "myserver" ]
```
Construir a partir deste dockerfile resulta em um tamanho final de imagem de apenas 6,55MB! Isso é **100 vezes menor do** que a nossa primeira tentativa, o que faz com que seja 100 vezes mais rápido retirar a imagem de um registro!
### Benefício bônus
Não apenas agora temos uma pequena imagem de janela de encaixe para nosso aplicativo, mas também temos apenas que nos preocupar com a segurança de nosso aplicativo, já que não há outro software em execução no contêiner.