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

2.5 KiB

title localeTitle
Separate Build Image 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 . O código a seguir é apenas um simples hello world webserver escutando na porta 8080 .

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.