Rust, Docker et déploiement



Pour mes besoins je cherche à déployer un binaire, produit par du code rust, dans une image docker. Surtout, sans avoir à monter une énorme infrastructure.

Pour le POC, je vais utiliser le Hello world fournit par Rust.

Commençons par créer l'image avec ce Dockerfile

La compilation avec le static linking est une obligation pour que cela fonctionne.

Je fais un build en plusieurs étapes :

  • la première se base sur une image rust contenant le nécessaire à la compilation. À noter, l'utilisation de la version Alpine car elle vient avec la version musl de libc et donc génère un binaire en static linking. Son travail est de compiler le code.
  • la deuxième, se contente de récupérer le binaire et de l'exécuter.

Ce qui se traduit en Dockerfile.

FROM rust:1.72-alpine as builder
ENV USER root
RUN cargo new hello
WORKDIR hello
RUN cargo build --release

FROM scratch
COPY --from=builder /hello/target/release/hello /hello
CMD ["/hello"]

Et donc pour builder :

docker build -t test/rust-hello:latest .

Cette technique permet d'avoir deux images, celle de compilation faisant 825Mo et celle pour l'exécution 4,77Mo. Et donc, il n'y aura que celle de 4,77Mo à déplacer sur le serveur.

Déploiement

D'abord on exporte

docker save test/rust-hello:latest -o hello.docker

On envoie, dans mon cas via scp. Et enfin, sur le serveur, on importe

docker load -i hello.docker

L'image est prête à être exécutée