web-dev-qa-db-fra.com

DockerFile Copie de l'image à l'hôte

J'ai un dockerfile dans lequel je compile d'abord le serveur Mosquitto en une seule couche, puis utilisez Copie pour copier les fichiers source d'un plug-in d'authentification dans l'image et exécutez enfin la compilation de ce plug-in.

Dans l'ensemble, l'image résultante est bonne à utiliser dans un conteneur qui a ensuite le serveur Mosquitto avec ce plug-in chargé.

Je veux modifier ce plug-in et le recompiler en ré-exécutant la construction du dockerfile. Étant donné que la première couche est non modifiée, elle copie simplement les fichiers modifiés et exécute à nouveau la compilation.

Ce que je veux faire maintenant, c'est d'extraire le plug-in (fichier .so) à partir de cette nouvelle image et de la déplacer dans un répertoire monté de l'hôte, de sorte que le serveur Mosquitto actuel n'aurait besoin d'être redémarré.

Est-il possible d'utiliser la commande de copie en sens inverse, de sorte qu'il copie le plug-in compilé dans un répertoire hôte spécifié afin que je puisse ensuite supprimer l'image nouvellement créée?

Ou est-ce une mauvaise approche? Devrais-je mieux exécuter dans le conteneur de course et devez-vous reconstruire le plug-in (qui me limiterait à construire le plug-in sur la machine sur laquelle le serveur est en cours d'exécution)?

8
Daniel F

Je ne connais pas les détails des outils de compilateur SEPCIFIC que vous utilisez, mais je pense que j'obtiens ce que vous essayez de réaliser:

Je n'inclut pas la commande de copie dans le dockerfile. Le dockerfile ne doit contenir que les instructions nécessaires pour avoir une image avec les outils et les dépendances nécessaires pour effectuer le processus de compilation et peut-être un script shell avec les commandes de compilation spécifiques.

Maintenant vous courez docker build Et vous avez votre image, appelons-le mosq. Supposons que:

  • Vous avez votre code source dans votre machine locale dans /home/me/my-source-code
  • Une fois rempli, vous avez le résultat dans un sous-dossier dist de ce dossier: /home/me/my-source-code/dist/result.so
  • Votre image a un script /compile.sh qui compile le code source présent dans /compilation (ce dossier doit être vide dans l'image)

Ensuite, vous exécutez le volume de montage d'image param: /home/me/my-source-code sur /compilation à l'intérieur du conteneur

En supposant tous les points précédents, le docker run La commande devrait ressembler à quelque chose de similaire à:

docker run -d --name my-compiler -v /home/me/my-source-code:/source mosq /compile.sh

Et voila, le conteneur fonctionnera silencieusement et meurt, et après cela, vous aurez votre compilation dans /home/me/my-source-code/dist/result.so

Les spécificités peuvent varier suffisamment selon les détails, mais j'espère que vous obtiendrez l'idée: préparez tout dans votre image afin d'exécuter un script SH unique, le compilateur prend le code de quelque part et est exécuté. Montez un volume avec le code dans ce dossier. Si le compilateur tire le résultat quelque part ailleurs, montez un autre volume de votre machine hôte pour obtenir le résultat.

5
gmc

La copie n'est probablement pas le bon outil pour ce que vous essayez d'atteindre.

Utilisez un volume d'exécution, comme @gmc le suggère ou copiez-le sur l'hôte en utilisant docker cp.

Usage

docker cp CONTAINER:SRC_PATH DEST_PATH

Cependant, je ne suis pas sûr que c'est la bonne approche en général. Il ne semble pas que Docker est l'outil dont vous avez besoin pour ce que vous essayez d'atteindre. Si vous souhaitez une instance de serveur mutable, il existe de meilleures options.

0
Ryan