2015-07-22 15 views
7

Próbuję uruchomić skrypt powłoki w moim kontenerze dokowania. Problem polega na tym, że skrypt powłoki uruchamia inny proces i powinien nadal działać, o ile nie zostanie użyty inny skrypt zamykający procesy, które zostały zainicjowane przez skrypt startowy.dokowanie uruchom skrypt powłoki w tle bez zamykania kontenera

Kiedy uruchomić komendę poniżej,

docker run image:tag /bin/sh /root/my_script.sh 

a następnie

docker ps -a 

widzę, że rozkaz został zakończony. Ale tego nie chcę. Moje pytanie brzmi: jak zezwolić na działanie polecenia w tle bez wychodzenia?

Odpowiedz

3

Nie wyjaśniłeś, dlaczego chcesz wyświetlić kontener działający po wyjściu skryptu lub czy oczekuje on od Ciebie zakończenia działania skryptu.

Kontener dokowany wylatuje, gdy tylko kontener CMD zostanie zamknięty. Jeśli chcesz, aby kontener nadal działał, będziesz potrzebował procesu, który będzie nadal działać. Jedną z opcji jest po prostu umieszczenie pętli na końcu skryptu:

while :; do 
    sleep 300 
done 

Twój skrypt nigdy nie wyjdzie, więc Twój kontener będzie działał dalej. Jeśli Twój kontener obsługuje usługę sieciową (serwer WWW, serwer bazy danych itp.), Zwykle jest to proces wykonywany przez cały okres eksploatacji kontenera.

Jeśli zamiast tego skrypt nieoczekiwanie kończy pracę, prawdopodobnie trzeba będzie przejrzeć dzienniki kontenera (docker logs <container>) i ewentualnie dodać trochę debugowania do skryptu.

Jeśli po prostu pytasz "Jak uruchomić kontener w tle?", Odpowiedź Emila (przekazanie flagi -d do docker run) pomoże.

1

Run ci pojemnik ze skryptu w tle z poniżej polecenia

docker run -i -t -d image:tag /bin/sh /root/my_script.sh 

Sprawdź identyfikator pojemnik komendą docker ps

Następnie sprawdź swój skrypt jest wykonywany lub nie na pojemniku

docker exec <id> /bin/sh -l -c "ps aux" 
4

Proces, w którym działa dokowanie, zajmuje miejsce init w drzewie procesu UNIX. init jest najwyższym procesem nadrzędnym, a po jego zakończeniu zatrzymuje się kontener dokowania. Wszystkie procesy potomne (teraz orphan process) również zostaną zatrzymane.

$ docker pull busybox >/dev/null 
$ time docker run --rm busybox sleep 3 

real 0m3.852s 
user 0m0.179s 
sys 0m0.012s 

Nie można dopuścić, aby pid dla rodziców został wyłączony, ale istnieją dwie opcje. Można zostawić procesu nadrzędnego w miejscu i pozwolić mu zarządzać jego dzieci (na przykład, mówiąc jej wait aż wszystkie procesy potomne wysuną)

$ time docker run --rm busybox sh -c 'sleep 3 & wait' 

real 0m3.916s 
user 0m0.178s 
sys 0m0.013s 

... czy można zastąpić procesu macierzystego z procesu potomnego przy użyciu exec. Oznacza to, że nowa komenda jest wykonywany w przestrzeni procesu nadrzędnego za ...

$ time docker run --rm busybox sh -c 'exec sleep 3' 

real 0m3.886s 
user 0m0.173s 
sys 0m0.010s 

To drugie podejście może być złożone w zależności od charakteru procesu potomnego, ale mają mniej niepotrzebnych uruchomionych procesów jest bardziej idiomatically dokowanym. (Co nie oznacza, że ​​powinieneś mieć tylko jeden proces: .)

Powiązane problemy