Найти в Дзене
ИТ разнообразно

Построение безопасных образов Docker для продакшн-среды — лучшие практики. Часть 2.

Оглавление

Создание готового к использованию образа 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.