Идти путями

Как создать минимальный образ Golang Docker

Сделайте образ Docker размером менее 10 МБ

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

Зачем нам это делать?

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

Минимальный проект

Я буду использовать простой веб-сервис HelloWorld для создания образа Docker.

Использование альпийского изображения

01. Докерфайл

Давайте напишем Dockerfile, используя дистрибутив alpine в качестве образа.

02. Сборка докера

После сборки этого Dockerfile мы получим образ 350 МБ.

➜  minimal-docker git:(main) ✗ docker build -t helloworld-large -f Dockerfile.large .
[+] Building 7.1s (12/12) FINISHED
...
...
... 
➜  minimal-docker git:(main) ✗ docker image ls helloworld-large
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
helloworld-large   latest    678f9303af18   10 seconds ago   350MB
➜  minimal-docker git:(main) ✗ docker run -ti -p 8000:8000 helloworld-large:latest
Server listen 8000...

Можем ли мы сделать лучше? Да мы можем!

Использование образа без дистрибутива

01. Докерфайл

Для следующего Dockerfile мы будем использовать многоэтапный подход и образ без дистрибутива от Google.

02. Сборка докера

Вуаля! После сборки мы получаем только размер изображения 8,6 МБ.

➜  minimal-docker git:(main) ✗ docker build -t helloworld-small -f Dockerfile.small .
[+] Building 8.0s (14/14) FINISHED
...
...
...
➜  minimal-docker git:(main) ✗ docker image ls helloworld-small
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
helloworld-small   latest    3b035dc2c7e4   5 seconds ago   8.6MB
➜  minimal-docker git:(main) ✗ docker run -ti -p 8000:8000 helloworld-small:latest
Server listen 8000...

Можем ли мы сделать лучше? Да мы можем!

Использование скретч-изображения

01. Докерфайл

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

02. Сборка докера

И мы получаем изображение размером 7,59 МБ.

➜  minimal-docker git:(main) ✗ docker build -t helloworld-xsmall -f Dockerfile.xsmall .
...
...
➜  minimal-docker git:(main) ✗ docker image ls helloworld-xsmall
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
helloworld-xsmall   latest    b7b554ac46c9   21 minutes ago   7.59MB

Полный код вы можете найти в моем репозитории GitHub pave-fokin/go-patterns/minimal-docker.

Удачного кодирования!

Спасибо, что прочитали! Поделитесь со мной своими мыслями в LinkedIn или Twitter.

Дальнейшие чтения

Если вам понравилась эта статья, вас может заинтересовать следующее.