2016-02-17 15 views
16

Zrobiłem trochę google i nie miałem szczęścia znajdując przypadek, w którym bym prowadził docker run -i some_image zamiast docker run -it some_image.Kiedy powinienem użyć `--interactive` bez` --tty` w kontenerze Docker?

Jeśli uruchomię docker run -i --name sample some_image bash, kontener będzie działał na pierwszym planie, ale nie będę mógł wchodzić z nim w interakcję z powłoki, w której się znajduję. Nie mogę nawet zatrzymać jej za pomocą CTRL + C. Mogę jednak otworzyć inną powłokę i uruchomić docker exec -it sample bash i uzyskać dostęp do kontenera.

Po uruchomieniu docker run -i -d --name sample some_image bash kontener natychmiast się kończy. Mogę uruchomić go ponownie pod numerem docker start sample, a następnie pozostanie w nim, więc mogę uruchomić docker exec -it sample bash i ponownie z nim współpracować.

Jednak we wszystkich tych przypadkach ostatecznie używam -it do interakcji z moimi kontenerami. W jakim świecie nie potrzebowałbym flagi -t?

Cheers

+0

II nie może dowiedzieć się, co będzie oczekiwany wynik '-i -d' – Auzias

+2

@Auzias '-i -d' znajduje się w przykładzie, który poniżej linkuję: https://github.com/docker/docker/blob/e4cfd9b3924fae0369956b4f0e7f73a7e3b0cbf7/integration-cli/docker_cli_attach_test.go#L139 : uruchamiasz i odrywasz proces, do którego możesz dołączyć i użyć stdin, aby przekazać proces z danymi. – VonC

Odpowiedz

16

Od -i utrzymuje STDIN otworzyć nawet jeśli nie jest ona połączona, pozwala na składzie (rurociągów).
Na przykład:

docker run ubuntu printf "line1\nline2\n" | docker run -i ubuntu grep line2 | docker run -i ubuntu sed 's/line2/line3/g' 

(Źródło: issue 14221)

Lub:

$ echo hello | docker run -i busybox cat 
    hello 

(Źródło: issue 12401)

Teraz wyobraź sobie, to nie przed klawiaturą i używany w skrypcie, gdzie rzeczywiście można napisać do procesów stdin za coś lepszego niż skorupa |: przykład integration-cli/docker_cli_attach_test.go

+0

Czy możesz krok po kroku wyjaśnić, co dokładnie dzieje się w pierwszym fragmencie? Czy w efekcie powstają 3 różne pojemniki? Czy 'printf 'wiersz1 \ nline2 \ n" 'działa w pierwszym kontenerze? Czy pierwszy kontener zapisuje '' wiersz1 \ nline2 \ n "' do konsoli hosta? Czy kontenery kończą się po wydrukowaniu "cześć"? – gisek

+1

@gisek 3 kontenery są uruchamiane kolejno, a każda z nich kończy się tuż po operacji 'echo' /' sed'. '-i' pozwala stdinowi uzyskać standardowe wyjście z poprzedniego kontenera. – VonC

+0

Dzięki. Po tym wszystkim, kończymy z 3 nowo utworzonymi zatrzymanymi kontenerami? – gisek

Powiązane problemy