5 способов оптимизации сборки Docker-образов

Хранение образа Nginx размером в 200+ Мбайт на базе Debian 9 может быть довольно затратным, поэтому рассмотрим пять способов уменьшения размера собираемых образов.

 

Способ 1 - уменьшение количества слоев в образе

Количество слоев в образе можно уменьшить, объединив несколько однородных инструкций в одну. Например, несколько логически связанных инструкций RUN можно объединить в одну с помощью конвейера Linux:

RUN apt-get update && apt-get install -y nginx

 

 

Способ 2 — удаляем ненужный кэш

Пакетный менеджер apt-get, обновляя репозиторий, сохраняет кэш, который в большинстве случаев не нужен, и его можно удалить, уменьшив тем самым размер образа. Сделать это можно командой: && rm -rf /var/lib/apt/lists/*.

RUN apt-get update && apt-get install -y nginx && rm -кf /var/lib/apt/lists/*

 

Способ 3 — копируем только нужные файлы

Обычно для копирования файлов в образ используется команда COPY с указанием места расположения проекта, как «.», что указывает на текущую директорию.

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

Исправить ситуацию призван файл .dockerignore, который работает так же как и .gitignore. В этих файлах указываются те папки и файлы, которые «не надо трогать».
.gitignore располагается в корневом каталоге копируемого в образ проекта. Обратите внимание на точку в начале названия файла — «.gitignore», так и должно быть.

Рассмотрим пример работы .gitignore. Например, мы работаем с GIT, и в нашем проекте есть git - репозиторий.

В docker образе он нам не нужен, поэтому его можно не копировать, а ещё в образе нам не нужен Dockerfile. Укажем эти файлы в .gitignore-файле:

.GIT
Dockerfile

При сборке образа Docker прочтет .dockerignore и не включит в образ указанные файлы.

 

Способ 4 — используем минималистические Linux-образа Alpine

Как правило, для сборки образов применяются дистрибутивы Debian, Ubuntu, CentOS.

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

Если же вам нужно просто создать контейнер с Nginx или иной другой программой — используйте Alpine.

 

Alpine-образ весит считанные мегабайты, при этом в нём есть всё необходимое для запуска большинства приложений. Например, так выглядит Dockerfile Nginx образа на Alpine сборке, который занимает 7 Мбайт:

FROM alpine
RUN apk add --no-cache nginx && mkdir -p /run/nginx
EXPOSE 80
COPY custom.conf /etc/nginx/conf.d
COPY . /opt/
CMD ["nginx","-g","daemon off;"]

 

Способ 5 — часто изменяемые слои ставим в конец

Слоистая структура Docker-образов имеет одно неприятное свойство — при внесении изменения в один из слоев, это слой и все последующие слои будут пересобраны.

Поэтому, чтобы сэкономить время на сборке образа — старайтесь ставить инструкции копирования кода проекта и конфигов в конец dockerfile до команды CMD или ENTRYPOINT.

  • 0 Пользователи нашли это полезным

Помог ли вам данный ответ?