Pourquoi" Docker attach " pend-il?

Je peux exécuter un conteneur ubuntu avec succès:

# docker run -it -d ubuntu
3aef6e642327ce7d19c7381eb145f3ad10291f1f2393af16a6327ee78d7c60bb
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3aef6e642327        ubuntu              "/bin/bash"         3 seconds ago       Up 2 seconds                            condescending_sammet

, Mais l'exécution de docker attach se bloque:

# docker attach 3aef6e642327

Jusqu'à ce que j'appuie sur une touche, comme Enter:

# docker attach 3aef6e642327
root@3aef6e642327:/#
root@3aef6e642327:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Pourquoi docker attach pend-il?

Mise à Jour:

Après avoir lu les commentaires, je pense avoir les réponses:

Prérequis:

"Docker attach" réutiliser le même tty, pas ouvrir un nouveau tty.

(1) Exécution du docker run sans mode démon:

# docker run -it ubuntu
root@eb3c9d86d7a2:/# 

Tout est OK, puis exécutez ls commande:

root@eb3c9d86d7a2:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@eb3c9d86d7a2:/#

(2) Exécuter docker run en mode démon:

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc

En fait, ce qui suit aurait dû être sorti sur stdout à partir du conteneur en cours d'exécution:

root@91262536f7c9:/#

Donc l'exécution de docker attach semble se bloquer, mais en fait elle attend votre entrée:

# docker attach 91262536f7c9
ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@91262536f7c9:/#
42
demandé sur HerbalMart 2016-02-23 12:33:17

6 réponses

Il ne pend pas vraiment . Comme vous pouvez le voir dans le commentaire ci-dessous (vous exécutez "/bin/bash" en tant que commande), il semble être un comportement attendu lors de la fixation.

Pour autant que je sache, vous attachez au shell en cours d'exécution et juste le stdin / stdout/stderr-en fonction des options que vous passez avec la commande run - vous montrera tout ce qui entre/sort A partir de ce moment. (Quelqu'un avec un peu plus de connaissances approfondies hopefuly peut expliquer cela sur un plus haut niveau).

Comme je l'ai écrit dans mon commentaire sur votre question, il y a plusieurs personnes qui ont ouvert un problème sur le repo Docker github décrivant un comportement similaire:

Puisque vous mentionnez shell, je suppose que vous avez déjà un shell en cours d'exécution. attach ne démarre pas un nouveau processus, donc Quel est le comportement attendu de la connexion aux flux in / out / err d'un processus en cours d'exécution? Je ne pense pas à ce sujet. Bien sûr, c'est le comportement attendu de l'attachement à un shell en cours d'exécution, mais est-ce souhaitable?

Serait - il possible de vider stdout / stderr sur Docker attach forçant ainsi l'invite du shell à être imprimée ou est-ce un peu plus complexe que cela? C'est ce que je "m'attends" personnellement lors de la fixation à un shell déjà en cours d'exécution.

N'hésitez pas à fermer ce problème si nécessaire, j'ai juste ressenti le besoin de documenter cela et d'obtenir des commentaires.

  • extrait d'un commentaire sur ce problème github . Vous pouvez trouver plus de perspicacité dans les commentaires de ce problème.

Si au lieu de enter vous commencez à taper une commande, vous ne verrez pas la ligne d'invitesupplémentaire vide. Si vous deviez courir

$ docker exec -it ubuntu <container-ID-or-name> bash 

Où {[11] } est L'ID ou le nom du conteneur après l'exécution docker run -it -d ubuntu (donc 3aef6e642327 ou condescending_sammet dans votre question) il exécuterait une commande new, n'ayant donc pas ce "problème stdout"d'attachement à un existant.

Exemple

Si vous avez un Dockerfile dans un répertoire contenant:

FROM ubuntu:latest
ADD ./script.sh /timescript.sh 
RUN chmod +x /timescript.sh
CMD ["/timescript.sh"]

Et avoir un script bash simple script.sh dans le même répertoire contenant:

#!/bin/bash

#trap ctrl-c and exit, couldn't get out
#of the docker container once attached
trap ctrl_c INT
function ctrl_c() {
    exit
}

while true; do
    time=$(date +%N)
    echo $time;
    sleep  1;
done

, Puis construire (dans cet exemple dans le même répertoire que le Dockerfile et script.sh) et l'exécuter avec

$ docker build -t nan-xiao/time-test .
..stuff happening...
$ docker run -itd --name time-test nan-xiao/time-test

Enfin attach

$ docker attach time-test

Vous finirez attaché à un conteneur imprimant le temps chaque seconde. (CTRL-C pour sortir)

Exemple 2

Ou si vous auriez un Dockerfile contenant par exemple ce qui suit:

FROM ubuntu:latest
RUN apt-get -y install irssi
ENTRYPOINT ["irssi"]

Puis exécutez dans le même répertoire:

$ docker build -t nan-xiao/irssi-test .

Puis exécutez-le:

$ docker run -itd --name irssi-test nan-xiao/irssi-test

Et enfin

$ docker attach irssi-test

Vous finiriez dans une fenêtre irssi en cours d'exécution sans ce comportement particulier. Bien sûr, vous pouvez remplacez irrsi par un autre programme.

25
répondu Francesco de Guytenaere 2017-04-07 11:09:53

J'ai également rencontré ce problème en essayant de l'attacher à un conteneur qui a été développé par quelqu'un d'autre et qui exécute déjà un démon. (Dans ce cas, C'était l'image Docker transmission de LinuxServer).

Problème:

Ce qui s'est passé, c'est que le terminal semblait "pendre", où taper n'importe quoi n'a pas aidé et n'apparaîtrait pas. Seulement {[1] } me repousserait.

docker run, docker start, docker attach tout n'a pas réussi, il s'avère que la commande dont j'avais besoin (après que le conteneur a été commencé avec run ou start) devait exécuter bash, car il y a des chances que le conteneur que vous avez tiré n'ait pas déjà bash en cours d'exécution.

Solution:

docker exec -it <container-id> bash

(Vous pouvez trouver le container-id en exécutant docker ps -a).

Cela vous attirera dans l'instance avec un bash fonctionnel comme root (en supposant qu'il n'y avait pas d'autre configuration explicite faite par l'image que vous avez tirée).

Je sais que la réponse acceptée a capturé cela aussi, mais a décidé d'en poster un autre qui est un peu plus laconique et évident, car la solution n'est pas apparue pour moi quand je la lisais.

7
répondu matrixanomaly 2017-10-30 05:26:14

Cela m'est arrivé une fois, pour la raison suivante:

Il se peut que la commande bash à l'intérieur du conteneur exécute une commande "cat".

Donc, lorsque vous attachez au conteneur (la commande bash), vous êtes réellement dans la commande cat Qui attend une entrée. (texte et/ou ctrl-d pour écrire le fichier)

1
répondu HerbalMart 2017-06-21 09:34:46

Si vous ne pouvez pas accéder à la ligne de commande, assurez-vous d'exécuter votre conteneur avec l'indicateur -i au démarrage.

0
répondu Ali Motameni 2017-08-04 15:19:26

Je viens d'avoir un problème similaire aujourd'hui et j'ai pu le résoudre:

Voici ce qui se passait pour moi:

docker-compose logs -f nginx
Attaching to laradock_nginx_1

Ensuite, il resterait là jusqu'à ce que je quitte via CTRL-C: ^CERROR: Aborting.

docker ps -a a montré que ce qui aurait dû être appelé laradock_nginx n'existait pas avec ce nom D'Image, donc j'ai pensé que je supprimerais et re "up" ce conteneur:

docker stop cce0c32f7556
docker rm cce0c32f7556
docker-compose up -d laradock_nginx

, Malheureusement: ERROR: No such service: laradock_nginx

Donc j'ai fait un sudo reboot, puis docker ps -a, mais laradock_nginx n'était toujours pas là.

Heureusement, docker-compose up -d nginx ensuite travaillé et docker-compose logs -f nginx fonctionne maintenant.

0
répondu Ryan 2018-09-02 16:53:56

Quand j'exécute docker attach container-name, alors rien de sortie, même Ctrl-c n'est invalide. Alors, essayez d'abord

docker attach container-name --sig-proxy=false

, puis ctrl-c peut l'arrêter. Pourquoi il n'a pas de sortie de quelque chose? juste parce que le conteneur ne sort pas. En fait, je dois entrer dans mon conteneur et exécuter une commande shell. Donc, la commande correcte est

docker exec -ti container-name bash
-1
répondu Billy Yang 2018-05-22 08:47:57