Создание готового к использованию образа Docker для продакшн-среды
Давайте оптимизируем наш Dockerfile. Чтобы уменьшить размер образа, мы реализуем многоэтапную сборку. При таком подходе мы по-прежнему используем официальный образ Rust для сборки приложения. После компиляции мы копируем бинарный файл из него в небольшой образ для продакшн-среды, в котором установлено и настроено всего несколько вещей. Эти изменения приводят к существенному сокращению занимаемого дискового пространства.
FROM rust:1.70.0 as builder
WORKDIR /usr/app
RUN USER=root cargo new --bin pokemon_api
WORKDIR /usr/app/pokemon_api
COPY ./Cargo.toml ./Cargo.toml
RUN cargo build --release
RUN rm src/*.rs
COPY ./src ./src
# 5. Build for release.
RUN rm ./target/release/deps/pokemon_api*
RUN cargo build --release
#--------
FROM debian:bookworm-slim
EXPOSE 8000
RUN apt-get update
RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/*
WORKDIR /usr/app
COPY --from=builder /usr/app/pokemon_api/target/release/pokemon_api /usr/app/pokemon_api
ADD ./rocket_config.toml Rocket.toml
CMD ["/usr/app/pokemon_api"]
Имея новый образ для продакшн-среды, давайте выясним, можем ли мы ещё что-то оптимизировать.
Предварительные требования
На следующих шагах мы используем локальный кластер Kubernetes (например, kind) для тестирования образа.
Когда кластер запущен и работает, давайте установим некоторые инструменты, которые помогут нам сканировать изображения.
В данном случае мы используем KubeClarity. Следуйте инструкциям по установке в README, чтобы установить его в свой кластер разработки.
Развёртывание образа Docker в локальном кластере
Установив KubeClarity, давайте развернём наш сервис.
(Исходный код примера можно найти здесь.)
kubectl create ns pokemon
kubectl apply -n pokemon -f k8s/deployment.yaml
Как уже упоминалось, этот сервис написан на Rust и выполняет простой HTTP-вызов для получения CSV-файла Pokemon, который возвращает данные JSON.
При дальнейшем изучении исходного кода вы заметите, что он использует std::process::Command и curl для выполнения HTTP-запроса.
При этом мы моделируем зависимость кода от определенных системных пакетов (curl).
Прежде, чем мы развернём эту службу в других средах, таких как стейджинг или продакшн, мы хотим выяснить, есть ли какие-либо потенциальные проблемы безопасности с этим конкретным образом.
Продолжение следует...
Перевод с некоторыми авторскими заголовками.
Автор оригинала: Jan Schulte.