tł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łączone centos: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 (jak httpd
). 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żywanie sleep
jako głównego polecenia.
$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d651c7a9e0ad centos:latest "sleep infinity" 2 seconds ago Up 2 seconds nervous_visvesvaraya
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ę:
$ docker run -t -d centos:latest
Nie jestem w 100% pewien, czy -t
spowoduje inne dziwne interakcje; może zostaw komentarz poniżej, jeśli tak jest.