Zgodnie z samouczkiem, który do tej pory przeczytałem, użycie „ docker run -d
” uruchomi kontener z obrazu, a kontener będzie działał w tle. Tak to wygląda, widzimy, że mamy już identyfikator kontenera.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Ale jeśli uruchomię „ docker ps
”, nic nie zostanie zwrócone.
Próbowałem więc „ docker ps -a
”, widzę, że kontener już się zakończył:
root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz
Coś źle zrobiłem? Jak mogę rozwiązać ten problem?
docker run -it -d <image> /bin/bash
tej funkcji, która uruchamia powłokę bash interaktywnie i nie zamyka pojemnika, ponieważ proces powłoki jest aktywny.Odpowiedzi:
Plik dokera centos ma domyślne polecenie
bash
.Oznacza to, że po uruchomieniu w tle (
-d
) powłoka natychmiast się kończy.Aktualizacja 2017
Nowsze wersje dokowanym uprawniających do prowadzenia kontenera, zarówno w trybie wolnostojącym , a w trybie planie (
-t
,-i
i-it
)W takim przypadku nie potrzebujesz żadnych dodatkowych poleceń, a to wystarczy:
Bash będzie czekał w tle.
Że początkowo zgłoszone w Kalyani-Chaudhari „s odpowiedź i wyszczególnione w jersey fasoli ” s odpowiedzi .
Należy pamiętać, że dla Alpine , Marinos donosi w komentarzach :
Oryginalna odpowiedź (2015)
Jak wspomniano w tym artykule :
To by działało:
A
docker ps
pokazuje, że kontener centos wciąż działa.Stamtąd możesz dołączyć do niego lub odłączyć się od niego (lub
docker exec
niektórych poleceń).źródło
docker exec -it <yourContainer> bash
.Zgodnie z tą odpowiedzią dodanie
-t
flagi zapobiegnie wyjściu kontenera podczas działania w tle. Następnie możesz użyć,docker exec -i -t <image> /bin/bash
aby wyświetlić monit powłoki.Wygląda na to, że opcja -t nie jest dobrze udokumentowana , chociaż pomoc mówi, że „alokuje pseudo-TTY”.
źródło
tail -f /dev/null
docker run -t -d --name mysql -p 3306:3306 mysql
- nie działa dla mnie (ubuntu 14.04.5): STATUS = Wyjście (1) 4 sekundy temutło
Kontener Docker uruchamia proces („polecenie” lub „punkt wejścia”), który utrzymuje go przy życiu. Kontener będzie działał tak długo, jak długo będzie działać polecenie.
W twoim przypadku polecenie (
/bin/bash
domyślnie włączonecentos:latest
) kończy się natychmiast (tak jak bash, gdy nie jest podłączone do terminala i nie ma nic do uruchomienia).Zwykle po uruchomieniu kontenera w trybie demona (z
-d
) kontener uruchamia jakiś proces demona (jakhttpd
). W takim przypadku, dopóki uruchomiony jest demon httpd, kontener pozostanie aktywny.Wygląda na to, że próbujesz utrzymać kontener przy życiu bez uruchamiania procesu demona wewnątrz kontenera. Jest to nieco dziwne (ponieważ kontener nie robi nic użytecznego, dopóki nie wejdziesz z nim w interakcję, być może z
docker exec
), ale są pewne przypadki, w których sensowne może być zrobienie czegoś takiego.(Czy chciałeś dostać się do bashu wewnątrz kontenera? To proste!
docker run -it centos:latest
)Rozwiązanie
Prostym sposobem na utrzymanie kontenera w trybie demona na czas nieokreślony jest uruchomienie go
sleep infinity
jako komendy kontenera. Nie polega to na robieniu dziwnych rzeczy, takich jak przydzielanie TTY w trybie demona. Chociaż polega na robieniu dziwnych rzeczy, takich jak używaniesleep
jako głównego polecenia.Alternatywne rozwiązanie
Jak wskazuje cjsimon,
-t
opcja przydziela „pseudo-tty”. Te sztuczki zmuszają do kontynuowania działania w nieskończoność, ponieważ wydaje się, że jest on podłączony do interaktywnego TTY (nawet jeśli nie masz możliwości interakcji z tym konkretnym TTY, jeśli go nie przejdziesz-i
). W każdym razie powinno to załatwić sprawę:Nie jestem w 100% pewien, czy
-t
spowoduje inne dziwne interakcje; może zostaw komentarz poniżej, jeśli tak jest.źródło
infinity
.Cześć, ten problem jest spowodowany zamknięciem kontenerów dokowanych, jeśli w kontenerze nie ma uruchomionej aplikacji.
opcją jest po prostu uruchomienie kontenera w trybie demona.
Zatem sztuczką, aby kontener działał nieprzerwanie, jest wskazanie pliku powłoki w oknie dokowanym, który utrzyma działanie aplikacji. Możesz spróbować z plikiem start.sh
Ten plik start.sh powinien wskazywać na niekończącą się aplikację.
W przypadku, gdy nie chcesz, aby jakakolwiek aplikacja była uruchomiona, możesz zainstalować,
monit
co zapewni utrzymanie kontenera dokującego. Daj nam znać, czy te dwa przypadki zadziałały, aby utrzymać działanie kontenera.Wszystkiego najlepszego
źródło
Możesz osiągnąć to, co chcesz:
lub
lub
Parametr polecenia sugerowany przez inne odpowiedzi (np. Tail -f / dev / null) jest całkowicie opcjonalny i NIE jest wymagany, aby kontener działał w tle.
Należy również pamiętać, że dokumentacja Dockera sugeruje, że połączenie opcji -i i -t spowoduje, że będzie on zachowywał się jak powłoka.
Widzieć:
https://docs.docker.com/engine/reference/run/#foreground
źródło
Mam ten fragment kodu uruchamiany z
ENTRYPOINT
mojego pliku dokera:Uruchom zbudowany obraz dokera jako:
Zaloguj się do powłoki kontenera:
źródło
wykonaj polecenie w następujący sposób:
jeśli chcesz podać port, wykonaj następujące polecenia:
sprawdź działający kontener za pomocą następującego polecenia:
źródło
-t -d
vs-i -d
? Oba utrzymają działanie kontenera.Docker wymaga polecenia, aby nadal działał na pierwszym planie. W przeciwnym razie uważa, że aplikacje zatrzymują się i zamykają kontener.
Jeśli więc skrypt wprowadzania dokera jest procesem w tle, taki jak:
„&” Powoduje zatrzymanie kontenera i wyjście z niego, jeśli później nie uruchomi się żaden inny proces pierwszego planu. Tak więc rozwiązaniem jest po prostu usunięcie „&” lub uruchomienie innego CMD pierwszego planu , takiego jak
źródło
touch
najpierw chcę ten plik, na wypadek gdyby nie można znaleźć pliku dziennika.Kontener Docker zostanie zamknięty, jeśli zadanie w środku zostanie wykonane, więc jeśli chcesz utrzymać go przy życiu, nawet jeśli nie ma on żadnej pracy lub jest już ukończony, możesz to zrobić
docker run -di image
. Gdy to zrobiszdocker container ls
, zobaczysz, że działa.źródło
Może to tylko ja, ale w CentOS 7.3.1611 i Docker 1.12.6, ale ostatecznie musiałem użyć kombinacji odpowiedzi opublikowanych przez @VonC i @Christopher Simon, aby niezawodnie działać. Nic, co zrobiłem wcześniej, nie powstrzymałoby wyjścia kontenera po pomyślnym uruchomieniu CMD. Zaczynam oracle-xe-11Gr2 i sshd.
Plik Docker
Następnie dodaj -d -t i -i, aby uruchomić
W końcu po godzinach walenia głową w ścianę
Z jakiegokolwiek powodu powyższe wyjdzie po wykonaniu CMD, jeśli tail -f zostanie usunięty lub jedna z opcji -t -d -i zostanie pominięta.
źródło
Wyjaśniłem to w następnym poście, który ma to samo pytanie.
Jak zachować pojemnik alpejski dokera po użyciu „wyjścia”?
źródło
Miałem ten sam problem, po prostu otworzyłem inny terminal z bash na nim zadziałało:
utwórz kontener:
uruchom kontener:
uruchom bash, aby utrzymać działanie kontenera:
rozpocznij proces potrzebujesz:
źródło
Jeśli używasz CMD na końcu pliku Docker, możesz dodać kod na końcu. Działa to tylko wtedy, gdy twój doker jest zbudowany na Ubuntu lub dowolnym systemie operacyjnym, który może korzystać z bash.
Krótko koniec twojego Dockerfile będzie wyglądał jak coś takiego.
Więc jeśli masz coś uruchomionego automatycznie po uruchomieniu obrazu dokera, a po zakończeniu zadania terminal bash będzie aktywny wewnątrz dokera. W ten sposób możesz wprowadzić polecenia powłoki.
źródło
Uruchomienie dokera w trybie interaktywnym może rozwiązać problem.
Oto przykład uruchamiania obrazu w trybie interaktywnym i bez niego
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
ID KONTENERA OBRAZ KOMUNIKAT STWORZONY STAN NAZWY PORTÓW
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
ID KONTENERA OBRAZ TWORZENIE STANU NAZWY PORTÓW c3d6a9529fd7 test_again1.0 „bash” 2 sekundy temu Do 1 sekundy awesome_haibt
źródło
jeśli chcesz operować na kontenerze, musisz uruchomić go na pierwszym planie, aby utrzymać go przy życiu.
źródło
Kolejność argumentów ma znaczenie
Odpowiedź z fasoli Jersey (wszystkie 3 przykłady) działała dla mnie. Po kilku próbach i błędach zdałem sobie sprawę, że kolejność argumentów ma znaczenie.
Utrzymuje działanie kontenera w tle:
docker run -t -d <image-name>
Utrzymuje kontener działający na pierwszym planie:
docker run <image-name> -t -d
Nie było dla mnie oczywiste, że pochodzi z Powershell.
źródło