Перейти к основному содержимому

Контейнеризация rust-приложений

Rust позволяет создавать полностью статические двоичные файлы. Эти двоичные файлы могут запускаться в контейнере Docker, который создается из пустого образа, а не из дистрибутива Linux. Эти образы создаются с помощью инструкции “FROM scratch”.

Scratch является базовым образом, на основе которого создаются образы операционных систем, такие как ubuntu, debian м другие.

При создании образа с помощью “FROM scratch” ваш исполняемый файл запускается в пустом контейнере, который не содержит ничего, кроме минимально необходимого для работы программы, что в большиньстве случаев состаялет один исполняемый файл.

Помимо минимального размера образа еще одним преимуществом является то, что он изолирует среду выполнения процесса. Даже если злоумышленник успешно взломает ваше программное обеспечение, он окажется в пустом контейнере без дальнейшего использования программного обеспечения.

Данный подход позволяет создавать компактные образы менее 10 мб, которые, например, отлично подходят для Serverless Containers в Яндекс Облаке.

Dockerfile

Пример эффективного докер-файла для программы на rust

Dockerfile
####################################################################################################
## 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 нужно заменить на название вашего приложения.