BrowserTools
Accueil / Convertisseurs / Docker run vers Compose

Docker run vers Compose

Transformez une commande docker run en fichier docker-compose.yml prêt à l'emploi.

Chargement de Docker run vers Compose… Si rien ne se passe, activez JavaScript.

La plupart des projets commencent par une ligne docker run copiée d'un README et finissent en un mur d'options que personne n'a envie de retaper. Collez cette commande ici et l'outil la réécrit en fichier docker-compose.yml, en associant chaque option reconnue à la clé Compose correspondante : -p devient ports, -v devient volumes, -e devient environment, --restart devient restart, et ainsi de suite pour environ soixante-dix options, y compris les contrôles de santé, les limites de ressources, les pilotes de journalisation, les capacités, les ulimits et les réservations de GPU.

Questions fréquentes

Ma commande docker run est-elle envoyée à un serveur ?
Non. L'analyseur et le générateur YAML sont du JavaScript ordinaire exécuté dans votre navigateur, et la page ne fait aucune requête réseau pendant la conversion. Les commandes contiennent souvent des mots de passe, des jetons ou des noms de registres privés, donc cela compte : vous pouvez coller une commande de production sans que rien ne soit envoyé, journalisé ou conservé.
Quelles options de docker run sont prises en charge ?
Environ soixante-dix, dont les plus courantes (--name, -p, -v, -e, --restart, --network, -w, -u, --entrypoint, --hostname), les limites de ressources (--memory, --cpus, --pids-limit, --shm-size, --ulimit), les options de sécurité (--cap-add, --cap-drop, --security-opt, --privileged, --read-only), la famille healthcheck, --log-driver avec --log-opt, --mount, --tmpfs, --sysctl, --device et --gpus. La liste complète figure dans le tableau de référence de la page, et tout ce qui n'est pas reconnu apparaît dans les Notes plutôt que de disparaître sans prévenir.
Pourquoi -d n'apparaît-il pas dans le fichier généré ?
L'exécution en arrière-plan n'est pas une propriété du service, c'est la manière de le démarrer. Compose lance tout en arrière-plan avec docker compose up -d, l'option n'a donc pas de clé dans le fichier. Il en va de même pour --rm, qui correspond à docker compose down, et pour les options liées au terminal comme -a et --detach-keys.
Ai-je besoin de la clé version en haut du fichier ?
Non, et c'est pourquoi elle est désactivée par défaut. La Compose Specification l'a supprimée et les versions récentes de Docker Compose affichent un avertissement lorsqu'elles la rencontrent. N'activez l'option que si vous utilisez encore l'ancien docker-compose v1 en Python, qui attend bien un champ version.
Que deviennent les volumes et les réseaux nommés ?
Un montage dont la source n'est pas un chemin, comme -v pgdata:/var/lib/postgresql/data, est un volume nommé : pgdata est donc ajouté à la section volumes de premier niveau. Les réseaux nommés passés avec --network sont ajoutés à la section networks avec la mention external, en partant du principe qu'ils existent déjà grâce à votre docker network create. Retirez external: true si vous préférez que Compose les crée avec le projet.
Puis-je convertir plusieurs conteneurs à la fois ?
Oui. Collez plusieurs commandes docker run, une par ligne ou enchaînées avec && ou ;, et chacune devient un service. Le nom du service vient de --name lorsqu'il est présent, sinon du nom de l'image, et les doublons reçoivent un suffixe numérique. C'est le moyen le plus rapide de transformer un script de démarrage d'une application et de sa base de données en un seul fichier Compose.
Pourquoi les correspondances de ports sont-elles entre guillemets ?
Parce qu'en YAML 1.1 un 22:22 sans guillemets est lu comme un nombre sexagésimal, le piège classique des débutants avec Compose. Les guillemets conservent la valeur sous forme de texte et la correspondance intacte. Les autres valeurs ne sont mises entre guillemets que lorsque c'est nécessaire, pour que le résultat reste lisible.
L'outil comprend-il --mount et les contrôles de santé ?
Oui. Une spécification --mount est réécrite dans la syntaxe longue des volumes avec type, source, target et read_only, ce qu'attend Compose pour les montages bind et tmpfs. Les options --health-cmd, --health-interval, --health-timeout, --health-retries et --health-start-period sont rassemblées dans un bloc healthcheck, la commande étant enveloppée dans CMD-SHELL sauf si elle commence déjà par CMD.
Comment exécuter le fichier une fois généré ?
Enregistrez-le sous docker-compose.yml (le bouton de téléchargement s'en charge), ouvrez un terminal dans ce dossier et lancez docker compose up -d. Vérifiez-le d'abord avec docker compose config, qui valide le fichier et le réaffiche avec tout résolu. Relisez la section Notes de cette page avant de lancer quoi que ce soit en production, car quelques options n'ont pas d'équivalent et peuvent demander une décision manuelle.

À propos de Docker run vers Compose

Le convertisseur lit la commande comme le ferait un interpréteur de commandes. Les continuations de ligne par barre oblique inverse, les guillemets simples et doubles, les options courtes avec la valeur accolée comme -p8080:80, les options groupées comme -itd et la forme --option=valeur sont toutes prises en charge, vous pouvez donc coller une commande telle quelle depuis la documentation, sans la nettoyer au préalable. Collez plusieurs commandes, une par ligne ou reliées par &&, et chacune devient un service du même fichier. Les volumes et les réseaux nommés utilisés par ces services sont regroupés et déclarés dans les sections volumes et networks de premier niveau, et les ports sont mis entre guillemets pour qu'une valeur comme 22:22 ne soit pas lue comme un nombre sexagésimal par l'analyseur YAML.

Les options qui n'ont de sens qu'au lancement d'un conteneur n'ont pas leur place dans un fichier Compose, et l'outil vous le dit au lieu de les supprimer en silence : -d est remplacé par docker compose up -d, --rm par docker compose down, et des options comme --cidfile ou --detach-keys apparaissent dans les Notes avec une explication courte. Tout s'exécute dans votre navigateur, sans appel serveur ni bibliothèque externe, si bien que les commandes contenant des mots de passe, des noms de registres privés ou des noms d'images internes ne quittent jamais la page. Copiez le résultat ou téléchargez-le sous le nom docker-compose.yml, puis lancez docker compose up -d dans le même dossier.

Compose s'appelait Fig à ses débuts

Avant Docker Compose, il y a eu Fig, un petit outil en Python publié en 2013 par Orchard Laboratories. Fig a introduit l'idée qu'une application à plusieurs conteneurs devait être décrite dans un seul fichier YAML et démarrée par une seule commande, à une époque où l'usage était un script shell rempli de lignes docker run. Docker a racheté Orchard en 2014 et Fig est devenu docker-compose l'année suivante, en conservant un format de fichier presque inchangé.

Le format a ensuite connu une décennie de remaniements. La version 1 n'avait même pas de clés de premier niveau, la version 2 a ajouté services, volumes et networks, et la version 3 a été façonnée par Docker Swarm, ce qui explique que des clés comme deploy apparaissent encore dans des fichiers qui ne verront jamais un swarm. La numérotation s'est arrêtée avec la Compose Specification, qui a fusionné les branches 2 et 3 et rendu le champ version obsolète.

La réécriture de Python vers Go dans Compose V2 a aussi changé la façon de l'appeler : docker-compose avec un trait d'union est devenu docker compose, une sous-commande de la CLI Docker. L'ancien binaire autonome a atteint sa fin de vie en juillet 2023, donc si un tutoriel vous demande encore d'ajouter version: '3.8' en haut du fichier, il a été écrit pour un outil que Docker ne distribue plus.

Soutenir