Docker, лекция 17. Создание оптимизированных Docker Images с помощью Multi-Stage Builds

Docker, лекция 17. Создание оптимизированных Docker Images с помощью Multi-Stage Builds

В этом уроке будет рассказано как использовать функциональность многоэтапной сборки для создания меньших, более оптимизированных образов.

Эта функция идеально подходит для развертывания таких языков, как Golang, в качестве контейнеров. Имея многоэтапные сборки, на первом этапе можно собрать двоичный файл Golang, используя в качестве основы более крупный образ Docker. На втором этапе вновь созданный двоичный файл может быть развернут с использованием намного меньшего базового образа. Конечный результат — оптимизированный образ Docker.

Начнем с Dockerfile

Функция Multi-Stage позволяет одному Dockerfile содержать несколько этапов, чтобы получить желаемый оптимизированный Docker образ.

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

Удаляя средства разработки в рабочем образе, вы уменьшаете вероятность атаки и сокращаете время развертывания.

Начнем с развертывания HTTP-сервера Golang. В настоящее время используется двухэтапный подход Docker Build. В этом сценарии будет создан новый файл Docker, который позволяет создавать образ с помощью одной команды.

git clone https://github.com/katacoda/golang-http-server.git

И наш Dockerfile.multi:

# First Stage
FROM golang:1.6-alpine

RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

# Second Stage
FROM alpine
EXPOSE 80
CMD ["/app"]

# Copy from first stage
COPY --from=0 /app/main /app

И запустим:

docker build -f Dockerfile.multi -t golang-app .

Результатом будут два образа. Один без тега, который использовался для первого этапа, а второй, меньший, — наш итоговый образ. Размер первого образа — 293МБ, размер второго — 12МБ.

Если появляется ошибка, COPY —from=0 /build/out /app/ Unknown flag, то это означает, что вы используете старую версию Docker без Multi-Stage поддержки и вам нужно обновится.

Теперь можно запустить приложение и проверить его доступность:

docker run -d -p 80:80 golang-app
curl localhost

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *