Контейнеризация 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 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
# Import from builder.
COPY /etc/passwd /etc/passwd
COPY /etc/group /etc/group
WORKDIR /app
# Copy our build
COPY /app/target/x86_64-unknown-linux-musl/release/test_app ./
# Use an unprivileged user.
USER app:app
CMD ["/app/test_app"]
В приведенном выше файле test_app
нужно заменить на название вашего приложения.