В качестве дополнения к статье "Построение безопасных образов 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.