Stworzyłem pojemnik, -d
więc nie jest interaktywny.
docker run -d shykes/pybuilder bin/bash
Widzę, że kontener wyszedł:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen
Teraz chciałbym uruchamiać sporadyczne polecenia na komputerze i wychodzić. Tylko po to, by uzyskać odpowiedź.
Próbowałem uruchomić maszynę. Próbowałem dołączyć. Myślałem, że mogę zadzwonić run
z kontenerem, ale wydaje się to niedozwolone. Korzystanie start
wydaje się działać, a następnie szybko istnieć.
Chciałbym wrócić do trybu interaktywnego po wyjściu.
Próbowałem:
docker attach d6c45e8cc5f0
Ale dostaję:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
Ale jeśli zacznę, i tak wychodzi. Złap 22. Nie mogę wygrać.
docker container ls -a
Odpowiedzi:
W październiku 2014 r. Zespół dokerów wprowadził
docker exec
polecenie : https://docs.docker.com/engine/reference/commandline/exec/Teraz możesz uruchomić dowolne polecenie w działającym kontenerze, znając tylko jego identyfikator (lub nazwę):
Zauważ, że
exec
polecenie działa tylko na już działającym kontenerze. Jeśli kontener jest obecnie zatrzymany, musisz go najpierw uruchomić za pomocą następującego polecenia:Najważniejszą rzeczą jest tutaj
-d
opcja, która oznaczadetached
. Oznacza to, że polecenie, które początkowo podałeś kontenerowi (/bin/bash
), zostanie uruchomione w tle, a kontener nie zatrzyma się natychmiast .źródło
CDR LDN
nacdrev
dla odpowiedzi poniżej ( stackoverflow.com/a/26181666/149428 ).-it
?Twój kontener zostanie zamknięty, ponieważ wydane polecenie zakończy się. Użyj następujących opcji, aby utrzymać go na żywo:
-i
Trzymaj STDIN otwarty, nawet jeśli nie jest podłączony.-t
Przydziel pseudo-TTY.Więc twoje nowe
run
polecenie to:Jeśli chcesz dołączyć do już działającego kontenera:
W tych przykładach
/bin/bash
zastosowano jako polecenie.źródło
docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"
i wydrukowana pusta zmienna (oczekiwana1
). czego mi brakuje?-it
nie jest on dostępny.Myślę więc, że odpowiedź jest prostsza niż wiele mylących odpowiedzi powyżej.
Aby uruchomić istniejący kontener, który jest zatrzymany
Aby zatrzymać działający kontener
Następnie, aby zalogować się do interaktywnej powłoki kontenera
Aby uruchomić istniejący kontener i dołączyć do niego jednym poleceniem
Uwaga, spowoduje to zatrzymanie pojemnika przy wyjściu. Ale ogólnie rzecz biorąc, musisz uruchomić pojemnik, dołączyć i zatrzymać go po zakończeniu.
źródło
Aby rozwinąć odpowiedź katrmr, jeśli kontener jest zatrzymany i nie można go uruchomić z powodu błędu, musisz
commit
to zrobić na obrazie. Następnie możesz uruchomić bash na nowym obrazku:źródło
dshell
aby zrobić to automatycznie w różnych sytuacjach - github.com/avirshup/docker-cli-sugarNiektóre odpowiedzi tutaj wprowadzają w błąd, ponieważ dotyczą kontenerów, które są uruchomione, a nie zatrzymane.
Sven Dowideit wyjaśnił na forum Dockera, że kontenery są związane z ich procesem (a Docker nie może zmienić procesu zatrzymanego kontenera, najwyraźniej z powodu jego wewnętrznej struktury: https://github.com/docker/docker/issues / 1437 ). Zasadniczo jedyną opcją jest
commit
przejście do kontenera na obraz irun
za pomocą innego polecenia.Zobacz https://forums.docker.com/t/run-command-in-stopped-container/343
(Wierzę, że
ENTRYPOINT
podejście „ z argumentami” też nie zadziałałoby, ponieważ nadal nie będziesz w stanie zmienić argumenty do zatrzymanego kontenera).źródło
bin/bash
bez-it
zmiany nie zmieni niczego w kontenerze, więc zatwierdzenie tego nie jest tak naprawdę konieczne, a CDR LDN daje właściwą odpowiedź na konkretną sytuację PO. Nadalcommit
jest odpowiedzią na techniczny problem zmiany procesu kontenerowego.Musiałem użyć bash -c, aby uruchomić polecenie:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
źródło
Tworzenie kontenera i wysyłanie do niego poleceń, jeden po drugim:
źródło
To jest połączona odpowiedź, którą wymyśliłem przy użyciu powyższej odpowiedzi CDR LDN i odpowiedzi, którą znalazłem tutaj .
Poniższy przykład uruchamia kontener Arch Linux z obrazu, a następnie instaluje się
git
w tym kontenerze za pomocąpacman
narzędzia:To wszystko.
źródło
Jeśli próbujesz uruchomić skrypt powłoki, musisz uruchomić go jako bash.
źródło
Potokuj polecenie, aby rozpocząć
Musisz usunąć
-t
, aby działało:Może to być wygodniejsze niż czasami korzystanie z opcji CLI.
Testowane z:
następnie na innej powłoce:
Następnie na pierwszej powłoce:
Testowany na Docker 1.13.1, host Ubuntu 16.04.
źródło
Zakładając, że obraz używa domyślnego punktu wejścia
/bin/sh -c
, uruchamianie/bin/bash
natychmiast zakończy działanie w trybie demona (-d
). Jeśli chcesz, aby ten kontener uruchamiał interaktywną powłokę, użyj-it
zamiast-d
. Jeśli chcesz wykonać dowolne polecenia w kontenerze zwykle wykonującym inny proces, możesz spróbowaćnsenter
lubnsinit
. Szczegółowe informacje można znaleźć na https://blog.codecentric.de/en/2014/07/enter-docker-container/ .źródło
Niestety nie można zastąpić
ENTRYPOINT
argumentami,docker run --entrypoint
aby osiągnąć ten cel.źródło
Chciałbym zauważyć, że najlepsza odpowiedź jest nieco myląca.
Problem z wykonywaniem
docker run
polega na tym, że za każdym razem tworzony jest nowy kontener. Są jednak przypadki, w których chcielibyśmy ponownie odwiedzić stare pojemniki lub nie zajmować miejsca z nowymi pojemnikami.(Dany
clever_bardeen
jest nazwa utworzonego kontenera ...)W przypadku OP upewnij się, że obraz dokera jest najpierw uruchomiony, wykonując następujące polecenie:
Następnie uruchom kontener dokowania za pomocą następującego polecenia:
źródło
Dla Maca:
jeśli chcesz połączyć się jako użytkownik root:
źródło
Prosta odpowiedź: zacznij i dołącz jednocześnie. W tym przypadku robisz dokładnie to, o co prosiłeś.
pamiętaj o zmianie
<CONTAINER_ID/CONTAINER_NAME>
źródło
Dawny:
źródło
Korzystam z kontenera systemu Windows i muszę zajrzeć do kontenera dokera w poszukiwaniu plików i folderów utworzonych i skopiowanych.
Aby to zrobić, użyłem następującego polecenia docker entrypoint, aby uruchomić wiersz polecenia w kontenerze lub dołączyć do kontenera.
Pomogło mi to zarówno w podłączeniu wiersza polecenia do kontenera, jak i utrzymaniu kontenera w stanie aktywnym. :)
źródło
Szybki sposób na wznowienie i dostęp do ostatnio opuszczonego kontenera:
źródło
Zwykle używam tego:
do ciągłej interakcji z działającym kontenerem.
źródło