Найти тему
ИТ разнообразно

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

Оглавление

В качестве дополнения к статье "Построение безопасных образов Docker для продакшн-среды", эта статья расследует, что вы можете сделать, чтобы оптимизировать создание образов Docker по времени и размеру сборки.

Особая благодарность Эду Варнике за предложение и вклад, которые привели к этоой статье.

Проблема

Вы работаете над новым микросервисом. Запланировано первое производственное развёртывание. Для производственных развеётываний требуется образ Docker.

Пришло время приступить к созданию простого Dockerfile:

FROM rust:1.69.0
WORKDIR /usr/app
RUN USER=root cargo new --bin hello
WORKDIR /usr/app/hello
COPY ./Cargo.toml ./Cargo.toml
RUN cargo build --release
RUN rm src/*.rs
COPY ./src ./src
RUN rm ./target/release/deps/hello*
RUN cargo build --release
CMD [ "./target/release/hello" ]

Основная цель — заставить приложение скомпилироваться и запуститься. Мы используем один из официальных образов Docker с уже предустановленным набором необходимых нам инструментов.

Быстрый запуск docker run подтверждает, что образ работает. Но стоит ли загружать его в реестр в таком виде? Скорее всего, нет.

Беглый взгляд на образы Docker подтверждает это:

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
largeimage latest da536ad251e2 6 weeks ago 2.25GB

Размер этого образа превышает 2 ГБ. Это много байтов для статически скомпилированного приложения.

Если мы проведём инвентаризацию содержимого образа, мы обнаружим, что мы доставляем полный инструментарий Rust и любые промежуточные файлы сборки в папке target/. Ни то, ни другое не требуется в производственной среде.

Большие образы проблематичны

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

Мы тратим место на хранение. Даже если хранение в целом доступно по цене, это излишне.

Мы доставляем ненужные файлы, такие как компиляторы или промежуточные/временные файлы сборки. Рабочий образ не нуждается в компиляторе. Если нам нужно перекомпилировать приложение, мы делаем это в рамках нашего конвейера CI/CD.

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

Продолжение следует...

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

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