81 lines
2.5 KiB
Markdown
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. |