Добавить в корзинуПозвонить
Найти в Дзене
ИТ разнообразно

Доставляем образы Docker меньшего размера - лучшие практики. Часть 4.

Пример (продолжение) Повторное использование /var/apt/lists При более детальном рассмотрении строки 22 мы видим COPY --from, что копирует файлы и директории из предыдущего этапа. Пример: FROM ubuntu:${UBUNTU_VERSION} as vppinstall COPY --from=vppbuild /var/lib/apt/lists/* /var/lib/apt/lists/ #(1) COPY --from=vppbuild [ "/vpp/build-root/libvppinfra_*_amd64.deb", "/vpp/build-root/vpp_*_amd64.deb", "/vpp/build-root/vpp-plugin-core_*_amd64.deb", "/vpp/build-root/vpp-plugin-dpdk_*_amd64.deb", "/pkg/"] Вместо копирования артефактов сборки копируем индексы apt (результат apt-get update). Копирование этих файлов экономит время, так как мы можем избежать повторного запуска команды apt-get update, которая обычно выполняется до apt-get install. Устанавливайте только необходимые пакеты при выполнении apt-get install Несколько вещей происходят за кулисами, когда вы запускаете apt-get install <package>. Чтобы более подробно рассмотреть это поведение, откройте терминал и выполните следующую команду:
Оглавление

Пример (продолжение)

Повторное использование /var/apt/lists

При более детальном рассмотрении строки 22 мы видим COPY --from, что копирует файлы и директории из предыдущего этапа.

Пример:

FROM ubuntu:${UBUNTU_VERSION} as vppinstall
COPY --from=vppbuild /var/lib/apt/lists/* /var/lib/apt/lists/ #(1)
COPY --from=vppbuild [ "/vpp/build-root/libvppinfra_*_amd64.deb", "/vpp/build-root/vpp_*_amd64.deb", "/vpp/build-root/vpp-plugin-core_*_amd64.deb", "/vpp/build-root/vpp-plugin-dpdk_*_amd64.deb", "/pkg/"]

Вместо копирования артефактов сборки копируем индексы apt (результат apt-get update).

Копирование этих файлов экономит время, так как мы можем избежать повторного запуска команды apt-get update, которая обычно выполняется до apt-get install.

Устанавливайте только необходимые пакеты при выполнении apt-get install

Несколько вещей происходят за кулисами, когда вы запускаете apt-get install <package>. Чтобы более подробно рассмотреть это поведение, откройте терминал и выполните следующую команду:

$ docker run --rm -it ubuntu:jammy /bin/bash
root@1a3eebf01ee7:/# apt-get update
<...omitted...>
root@1a3eebf01ee7:/# apt-get install vim
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
libexpat1 libgpm2 libmpdec3 libpython3.10 libpython3.10-minimal libpython3.10-stdlib libreadline8 libsodium23 libsqlite3-0
media-types readline-common vim-common vim-runtime xxd
Suggested packages:
gpm readline-doc ctags vim-doc vim-scripts
The following NEW packages will be installed:
libexpat1 libgpm2 libmpdec3 libpython3.10 libpython3.10-minimal libpython3.10-stdlib libreadline8 libsodium23 libsqlite3-0
media-types readline-common vim vim-common vim-runtime xxd
0 upgraded, 15 newly installed, 0 to remove and 0 not upgraded.

В выводе вы заметите, как apt сообщает нам о необходимых зависимостях и предлагаемых пакетах. Если мы хотим, чтобы vim работал корректно, без необходимых пакетов не обойтись.

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

Debian определяет их следующим образом:

Рекомендации
Это указывает на сильную, но не абсолютную зависимость. Поле Recommends должно перечислять пакеты, которые обычно устанавливаются вместе с данным пакетом, за исключением необычных случаев.
Предложения
Это используется для объявления, что один пакет может быть более полезным с одним или несколькими другими пакетами. Использование этого поля сообщает системе управления пакетами и пользователю, что перечисленные пакеты связаны с данным пакетом и, возможно, могут улучшить его полезность, но установка данного пакета без них также является разумной.

Источник: https://lists.debian.org/debian-mentors/2007/08/msg00037.html.

Например, пакет virtualbox поставляется с рекомендуемыми пакетами.

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

Чтобы убедиться, что мы устанавливаем только то, что необходимо, мы можем использовать --no-install-recommends:

RUN VPP_INSTALL_SKIP_SYSCTL=false apt install -f -y --no-install-recommends /pkg/*.deb ca-certificates iputils-ping iproute2 tcpdump iptables; \
rm -rf /var/lib/apt/lists/*; \
rm -rf /pkg

Этот флаг пропускает все рекомендованные и рекомендуемые пакеты.

Что ты думаешь?

Какие ещё шаги ты предпринимаешь для доставки небольших образов Docker?

Делись своими советами и хитростями в комментариях.

Перевод с некоторыми авторскими заголовками.

Автор оригинала: Jan Schulte.