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

3.7 KiB
Raw Blame History

title localeTitle
Separate Build Image Отдельное изображение сборки

обзор

Создание облегченных изображений докеров является ключом к быстрому развитию / развертыванию. Для скомпилированного кода построение двоичного файла внутри контейнера докеров имеет преимущество в виде повторяемого и стандартизованного процесса сборки. Однако это может создать очень большие изображения, которые могут стать проблемой на линии.

Наш код

В этом примере мы будем использовать простой сценарий веб-сервера в Go . Следующий код - просто простой веб-сервер приветствия, прослушивающий порт 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

Файл Docker для этого кода может выглядеть примерно так:

FROM golang:1.11 
 
 ADD . /app 
 
 WORKDIR /app 
 
 RUN go build -o /myserver . 
 
 EXPOSE 8080 
 
 CMD [ "/myserver" ] 

Построение этого изображения приводит к изображению размером 783 МБ !! С изображением такого размера для простого приложения легко понять, как это может замедлить работу при развертывании.

Лучшее решение

Лучшим решением было бы использовать отдельный образ сборки для создания двоичного файла, а затем скопировать его в окончательное изображение. Поскольку Go генерирует автономный двоичный файл, мы можем использовать изображение докеры с scratch в качестве базы, которая примерно такая же маленькая, как и она!

Dockerfile

Следующий файл Dockerfile сначала построит двоичный файл внутри изображения golang, а затем построит новое изображение с нуля, скопировав двоичный файл с первого изображения на второй.

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" ] 

Создание из этого файла dockerfile приводит к окончательному размеру изображения всего 6.55MB! Это более чем в 100 раз меньше нашей первой попытки, сделав ее в 100 раз быстрее, чтобы вытащить изображение из реестра!

Бонусная выгода

Мы не только имеем крошечный образ докеры для нашего приложения, но и беспокоимся о безопасности нашего приложения, поскольку в нем нет другого программного обеспечения.