2017-04-19 4 views
1

J'ai essayé d'exécuter bash sur un conteneur docker qui a un nom spécifique comme suit. --(1)Exécution de `bash` à l'aide de l'exec docker avec la commande xargs

docker ps | grep somename | awk '{print $1 " bash"}' | xargs -I'{}' docker exec -it '{}' 

mais ça n'a pas marché et il affiche un message comme

"docker exec" nécessite au moins 2 argument (s)




lorsque j'ai essayé d'utiliser la commande comme suit --(2)

docker ps | grep somename | awk '{print $1 " bash"}' | xargs docker exec -it 

il montre un autre message d'erreur comme

le dispositif d'entrée n'est pas un ATS




Mais quand j'essayé d'utiliser ($) (sous shell) alors il peut être accompli mais je ne peux pas comprendre pourquoi cela ne fonctionne pas avec les deux codes (1) (2) ci-dessus (en utilisant xargs)

Quelqu'un pourrait-il expliquer pourquoi cela se produit?

J'apprécie vraiment toute aide que vous pouvez fournir à l'avance =)




EDIT 1:

Je sais comment atteindre mon objectif d'une autre manière, comme

docker exec -it $(docker ps | grep perf | awk '{print $1 " bash"}') 

Mais je suis simplement curieux de savoir pourquoi ces codes ne fonctionnent pas =)

Répondre

2
  • première question

"docker exec" nécessite au moins deux arguments (s)

Dans la dernière commande de la conduite, l'entrée standard de xargs est- par exemple, 42a9903486f2 bash. Et vous avez utilisé xargs avec l'option -I (remplacer la chaîne). Ainsi, docker reconnaît que 42a9903486f2 bash est un premier argument, sans 2ème argument.

Ci-dessous l'exemple est peut-être ce que vous attendiez.

docker ps | grep somename | awk '{print $1 " bash"}' | xargs bash -c 'docker exec -it $0 $1' 
  • Deuxième question

le dispositif d'entrée n'est pas un ATS

xargs excutes commande sur un nouveau processus enfant. Vous devez donc rouvrir le processus stdin to child pour une communication interactive. (MacOS: option -o)

docker ps | grep somename | awk '{print $1 " bash"}' | xargs -o docker exec -it 
+0

C'est la réponse parfaite que je m'attendais. J'apprécie vraiment votre réponse aimable =) Cela m'a vraiment beaucoup aidé – Abraxas5

0

La commande exec vous exécutez est quelque chose comme ceci:

docker exec -it 'a1b2c3d4 bash' 

Et qui est seulement un argument, pas deux. Vous devez supprimer les guillemets autour de l'argument de docker exec.

... | xargs -I'{}' docker exec -it {} 

Ensuite, vous exécutez correctement avec deux arguments.

docker exec -it a1b2c3d4 bash 
       ------ --- 
     first arg^ ^second arg 
+0

Merci Dan. J'ai aussi essayé d'utiliser "docker ps | grep somename | awk '{print $ 1 "bash"} | xargs -I '{}' docker exec {} -it" mais il ne fonctionne pas pour moi ^^; Il montre le message '" docker exec "nécessite au moins 2 argument (s)' comme le résultat du premier essai. – Abraxas5

+0

@ user3400490 Quelle erreur obtenez-vous dans cette tentative? –

+0

'" docker exec "nécessite au moins 2 argument (s) comme le résultat du premier essai. 'comme le commentaire édité ci-dessus =) – Abraxas5