2016-03-17 58 views
5

Mam program narzędziowy, który zależy od charakterystyki terminala. Chcę wykonać go wewnątrz kontenera dokera. (program nie jest programem interaktywnym jako takim, jest to stary program napisany w ten sposób).Docker: wykonaj program wymagający tty

lub docker exec -i -t powinien otworzyć tty do pojemnika. Ale o to, co się dzieje ..

[email protected]:~/region/primer/cobol_v> kickstop 
[Error] Unable to run without terminal device (tty) 
[email protected]:~/region/primer/cobol_v> tty 
not a tty 

Gdy opcja -t do polecenia (uruchom/exec) dokowanym powinno dać „tty”, tty polecenia powraca z „nie tty”. To jest zagadkowe.

Doświadczyłem tego na hostach i obrazach openSuse i fedora23, jeśli to ma znaczenie. Użyłem do tego emulatora terminala "guake", MATE (Gnome?), Z tymi samymi wynikami.

Czy istnieje rozwiązanie tego problemu? lub jest to zgodne z projektem i musi zastąpić/przepisać moje narzędzie?

+0

można zakładać 'echo $ TERM' gdy wewnątrz kontenera? – user2915097

+0

@ user2915097: Twoje pytanie skłoniło mnie do przeprowadzenia niektórych eksperymentów. Odpowiedziałem na własne pytanie. Dzięki. – yogmk

Odpowiedz

0

Przeprowadziłem kilka eksperymentów i oto ustalenia. Mam nadzieję, że ktoś uzna je za przydatne. (polecenia dokowane nie są kompletne, ale tylko krótki)

1. docker run -i -t 
> tty 
/dev/console 
> echo $TERM 
xterm 
>kickstop 
works!! 

2. docker -d następnie docker exec -i -t

>tty 
not a tty 
>echo $TERM 
dumb 
>kickstop 
[Error] Unable to run without terminal device (tty) 

3. docker -d następnie docker attach Ci dołączonym do/dev/konsoli. Brak zachęty (ponieważ uruchamiam ogon -f xxx.log, aby utrzymać pojemnik przy życiu). W rzeczywistości muszę zatrzymać moją aplikację z innego terminalu (używając Döcker exec) i zatrzymać pojemnik wrócić do szybkiego (okrycie gospodarza)

4. docker start następnie docker attach sam jak wyżej

+0

i który emulator terminalu, którego używam, nie ma na to wpływu, – yogmk

1

I pobiegł do ten sam problem, a znaleziony "docker exec-to-container script/dev/null" rozwiązał problem.

Po zalogowaniu się do kontenera za pomocą powyższego polecenia mogę normalnie korzystać z ekranu.

referencyjny: https://github.com/docker/docker/issues/8755