⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

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.

  1. Créez un nouveau répertoire pour cet exemple, et naviguez-y :

    $ mkdir hello-world-bin
    $ cd hello-world-bin
    
  2. 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"]
    Tip

    La 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.

  3. 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.