Хранение образа 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.