Контейнеризация Rust-приложений
Rust позволяет создавать полностью статические двоичные файлы. Эти двоичные файлы могут запускаться в контейнере Docker, который создается из пустого образа, а не из дистрибутива Linux. Эти образы создаются с помощью инструкции FROM scratch.
Scratch является базовым образом, на основе которого создаются образы операционных систем, такие как ubuntu, debian и другие.
При создании образа с помощью FROM scratch ваш исполняемый файл запускается в пустом контейнере, который не содержит ничего, кроме минимально необходимого для работы программы, что в большинстве случаев составляет один исполняемый файл.
Помимо минимального размера образа ещё одним преимуществом является то, что он изолирует среду выполнения процесса. Даже если злоумышленник успешно взломает ваше программное обеспечение, он окажется в пустом контейнере без дальнейшего использования программного обеспечения.
Данный подход позволяет создавать компактные образы менее 10 МБ, которые, например, отлично подходят для Serverless Containers в Яндекс Облаке.
Dockerfile
Пример эффективного докер-файла для программы на Rust:
#################################################################################################### ## Builder #################################################################################################### FROM rust:latest AS builder RUN rustup target add x86_64-unknown-linux-musl RUN apt update && apt install -y musl-tools musl-dev RUN update-ca-certificates # Create appuser ENV USER=app ENV UID=10001 RUN adduser \ --disabled-password \ --gecos \"\" \ --home \"/nonexistent\" \ --shell \"/sbin/nologin\" \ --no-create-home \ --uid \"${UID}\" \ \"${USER}\" WORKDIR /app COPY ./ . RUN cargo build --target x86_64-unknown-linux-musl --release #################################################################################################### ## Final image #################################################################################################### FROM scratch COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ # Import from builder. COPY --from=builder /etc/passwd /etc/passwd COPY --from=builder /etc/group /etc/group WORKDIR /app # Copy our build COPY --from=builder /app/target/x86_64-unknown-linux-musl/release/test_app ./ # Use an unprivileged user. USER app:app CMD [\"/app/test_app\"]
В приведённом выше файле test_app нужно заменить на название вашего приложения.