Ответ 1
На самом деле это не висит. Как вы можете видеть в комментарии ниже (вы запускаете команду "/bin/bash
" ), похоже, это будет ожидаемое поведение при подключении.
Насколько я понимаю, вы прикрепляетесь к рабочей оболочке, а только stdin/stdout/stderr - в зависимости от параметров, которые вы передаете вместе с командой run, - просто покажет вам, что входит в/из с этого момента. (Кто-то с немного более глубокими знаниями надежно может объяснить это на более высоком уровне).
Как я писал в своем комментарии к вашему вопросу, есть несколько человек, которые открыли проблему в репозитории docker github, описывая подобное поведение:
- docker attach [container] зависает, требует ввода # 8521
- прикрепление док-станции зависает при настройке состояния терминала при подключении к контейнеру
Поскольку вы упоминаете оболочку, я предполагаю, что у вас уже запущена оболочка. attach не запускает новый процесс, так каково ожидаемое поведение подключения к потокам in/out/err текущего процесса? Я об этом не думал. Конечно, это ожидаемое поведение присоединения к рабочей оболочке, но желательно ли это?
Было бы возможно сбросить stdout/stderr на докере-присоединение, тем самым вынудив приглашение оболочки распечатать или это немного сложнее? Это то, что я лично "ожидал" при подключении к уже запущенной оболочке.
Не стесняйтесь закрыть эту проблему, если это необходимо, я просто почувствовал необходимость документировать это и получить некоторую обратную связь.
- Взято из comment в этом проблема github. Вы можете найти больше информации в комментариях к этой проблеме.
Если вместо enter
вы начнете вводить команду, вы не увидите лишнюю пустую строку подсказки. Если вы запустите
$ docker exec -it ubuntu <container-ID-or-name> bash
где <container-ID-or-name>
- это идентификатор или имя контейнера после запуска docker run -it -d ubuntu
(так что 3aef6e642327 или condescending_sammet в вашем вопросе), он будет запускать новую команду, поэтому не будет иметь эту проблему "stdout" для присоединения к существующему один.
Пример
Если у вас есть Dockerfile
в каталоге, содержащем:
FROM ubuntu:latest
ADD ./script.sh /timescript.sh
RUN chmod +x /timescript.sh
CMD ["/timescript.sh"]
И иметь простой bash script script.sh
в том же каталоге, который содержит:
#!/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
Затем создайте (в этом примере в том же каталоге, что и файл Dockerfile и script.sh), и запустите его с помощью
$ docker build -t nan-xiao/time-test .
..stuff happening...
$ docker run -itd --name time-test nan-xiao/time-test
Наконец attach
$ docker attach time-test
В конечном итоге вы будете прикреплены к контейнеру, распечатывая время каждую секунду. (CTRL-C, чтобы выйти)
Пример 2
Или, если у вас есть Dockerfile
, содержащий, например, следующее:
FROM ubuntu:latest
RUN apt-get -y install irssi
ENTRYPOINT ["irssi"]
Затем запустите в том же каталоге:
$ docker build -t nan-xiao/irssi-test .
Затем запустите его:
$ docker run -itd --name irssi-test nan-xiao/irssi-test
И наконец
$ docker attach irssi-test
Вы попадете в текущее irssi
окно без этого конкретного поведения. Конечно, вы можете заменить irrsi
на другую программу.