web-dev-qa-db-fra.com

Comment puis-je exécuter les commandes de Docker après "l'exécution de Docker" à partir d'un script?

Mon dernier objectif est de démarrer un conteneur Docker et de déplacer certains fichiers dans ce conteneur Docker. Parce que cela prend plusieurs commandes, je veux écrire un script qui le fait automatiquement (au lieu d'écrire toutes ces commandes à la main). Mon plan ici est de créer un script bash pour cela.

Le problème commence juste après la première commande:

nvidia-docker run -it --name "Test" gcr.io/tensorflow/tensorflow:latest-gpu

Cela a mis la sortie suivante à l'écran (dans la même interface graphique que le terminal Ubuntu où j'ai écrit la commande):

[I 14:42:36.484 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 14:42:36.509 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 14:42:36.513 NotebookApp] Serving notebooks from local directory: /notebooks
[I 14:42:36.513 NotebookApp] 0 active kernels 
[I 14:42:36.513 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:8888/?token=6731bf8e21c987cd142076cbeb77ed3cf0f97275bcdb7bce
[I 14:42:36.513 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 14:42:36.513 NotebookApp] 

Maintenant, je peux "quitter" ceci en tapant ctrl + C, ce qui me permet de "revenir" au terminal d'origine (toujours, même interface graphique) et de recommencer à taper les commandes du terminal Ubuntu. Mais comment reproduire cette action dans un script?

2
dimpol

Je pense que ce qui vous manque, c'est le paramètre -d pour l'exécuter en arrière-plan

docker run -d --name "Test" gcr.io/tensorflow/tensorflow:latest-gpu

Faire cela démarre le conteneur sans vous transférer dessus. Ainsi, votre script peut continuer à exécuter d'autres commandes.

Maintenant, si vous devez réellement "déplacer des fichiers" dans le conteneur, vous pouvez monter votre script en tant que volume et l'exécuter.

docker run -d -v$(pwd):/my --name Test gcr.io/tensorflow/tensorflow:latest-gpu bash 
docker exec -d Test bash /my/script.sh

Ainsi, vous montez votre répertoire de travail prédéfini dans le conteneur, puis exécutez ce script dans le conteneur tout en continuant votre script d'origine. alors ajoutez

docker exec -it Test bash

et maintenant vous êtes dans votre conteneur, après avoir exécuté le script.

ou bien, vous pouvez simplement exécuter plusieurs commandes docker exec au lieu de monter un dossier.

#!/bin/bash
docker run  -d --name Test gcr.io/tensorflow/tensorflow:latest-gpu bash 
docker exec -d  Test bash cp /x /y
docker exec -d  Test bash cp /y /z
docker exec -it Test bash
2
AwokeKnowing