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

81 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Separate Build Image
localeTitle: Отдельное изображение сборки
---
## обзор
Создание облегченных изображений докеров является ключом к быстрому развитию / развертыванию. Для скомпилированного кода построение двоичного файла внутри контейнера докеров имеет преимущество в виде повторяемого и стандартизованного процесса сборки. Однако это может создать очень большие изображения, которые могут стать проблемой на линии.
## Наш код
В этом примере мы будем использовать простой сценарий веб-сервера в [Go](https://golang.org/) . Следующий код - просто простой веб-сервер приветствия, прослушивающий порт `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
Файл 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 раз быстрее, чтобы вытащить изображение из реестра!
### Бонусная выгода
Мы не только имеем крошечный образ докеры для нашего приложения, но и беспокоимся о безопасности нашего приложения, поскольку в нем нет другого программного обеспечения.