Exporter des binaires
Saviez-vous que vous pouvez utiliser Docker pour compiler votre application en binaires autonomes ? Parfois, vous не souhaitez pas empaqueter et distribuer votre application sous forme d'image Docker. Utilisez Docker pour compiler votre application et utilisez des exportateurs pour enregistrer la sortie sur le disque.
Le format de sortie par défaut pour docker build
est une image de conteneur. Cette image est
automatiquement chargée dans votre magasin d'images local, où vous pouvez exécuter un conteneur
à partir de cette image, ou la pousser vers un registre. En coulisses, cela utilise l'exportateur
par défaut, appelé l'exportateur docker
.
Pour exporter les résultats de votre build sous forme de fichiers, vous pouvez utiliser l'indicateur --output
,
ou -o
en abrégé. L'indicateur --output
vous permet de modifier le format de sortie de
votre build.
Exporter des binaires à partir d'un build
Si vous spécifiez un chemin de fichier à l'indicateur docker build --output
, Docker exporte
le contenu du conteneur de build à la fin du build vers l'emplacement spécifié
sur le système de fichiers de votre hôte. Cela utilise l'exportateur
local
.
Ce qui est intéressant, c'est que vous pouvez utiliser les puissantes fonctionnalités d'isolation et de build de Docker pour créer des binaires autonomes. Cela fonctionne bien pour Go, Rust et d'autres langages qui peuvent compiler en un seul binaire.
L'exemple suivant crée un programme Rust simple qui affiche "Hello, World !", et exporte le binaire sur le système de fichiers de l'hôte.
-
Créez un nouveau répertoire pour cet exemple, et naviguez-y :
$ mkdir hello-world-bin $ cd hello-world-bin
-
Créez un Dockerfile avec le contenu suivant :
# syntax=docker/dockerfile:1 FROM rust:alpine AS build WORKDIR /src COPY <<EOT hello.rs fn main() { println!("Hello World!"); } EOT RUN rustc -o /bin/hello hello.rs FROM scratch COPY --from=build /bin/hello / ENTRYPOINT ["/hello"]
TipLa syntaxe
COPY <<EOT
est un here-document. Elle vous permet d'écrire des chaînes de plusieurs lignes dans un Dockerfile. Ici, elle est utilisée pour créer un programme Rust simple en ligne dans le Dockerfile.Ce Dockerfile utilise un build multi-étapes pour compiler le programme dans la première étape, puis copie le binaire dans une image scratch dans la seconde. L'image finale est une image minimale qui ne contient que le binaire. Ce cas d'utilisation de l'image
scratch
est courant pour créer des artefacts de build minimaux pour les programmes qui ne nécessitent pas un système d'exploitation complet pour s'exécuter. -
Compilez le Dockerfile et exportez le binaire dans le répertoire de travail actuel :
$ docker build --output=. .
Cette commande compile le Dockerfile et exporte le binaire dans le répertoire de travail actuel. Le binaire s'appelle
hello
, et il est créé dans le répertoire de travail actuel.
Exportation de builds multi-plateformes
Vous utilisez l'exportateur local
pour exporter des binaires en combinaison avec
les
builds multi-plateformes. Cela vous permet de
compiler plusieurs binaires à la fois, qui peuvent être exécutés sur n'importe quelle machine de n'importe quelle
architecture, à condition que la plate-forme cible soit prise en charge par le compilateur
que vous utilisez.
En continuant sur l'exemple de Dockerfile dans la section Exporter des binaires à partir d'un build :
# syntax=docker/dockerfile:1
FROM rust:alpine AS build
WORKDIR /src
COPY <<EOT hello.rs
fn main() {
println!("Hello World!");
}
EOT
RUN rustc -o /bin/hello hello.rs
FROM scratch
COPY --from=build /bin/hello /
ENTRYPOINT ["/hello"]
Vous pouvez compiler ce programme Rust pour plusieurs plates-formes en utilisant l'indicateur --platform
avec la commande docker build
. En combinaison avec l'indicateur --output
,
le build exporte les binaires pour chaque cible dans le répertoire spécifié.
Par exemple, pour compiler le programme pour linux/amd64
et linux/arm64
:
$ docker build --platform=linux/amd64,linux/arm64 --output=out .
$ tree out/
out/
├── linux_amd64
│ └── hello
└── linux_arm64
└── hello
3 directories, 2 files
Informations supplémentaires
En plus de l'exportateur local
, il existe d'autres exportateurs disponibles. Pour
en savoir plus sur les exportateurs disponibles et comment les utiliser, consultez la
documentation sur les
exportateurs.