2017-02-14 44 views
5

Chcę ustawić konfigurację, gdy mój kontener się uruchomi, do tego używam skryptów powłoki. Ale mój kontener zakończy działanie, gdy tylko moje skrypty się zakończą, próbowałem z opcją -d flaga/odłączony, ale nigdy nie uruchomi się w trybie odłączonym.Instrukcja CMD Dockerfile wyjdzie z kontenera zaraz po uruchomieniu

Poniżej jest moje Dockerfile

FROM ubuntu:14.04 

ADD shell.sh /usr/local/bin/shell.sh 

RUN chmod 777 /usr/local/bin/shell.sh 

CMD /usr/local/bin/shell.sh 

Poniżej jest mój skrypt

#!/bin/bash 
echo Hello-docker 
  1. Run bez flagi

    docker run hello-docker 
    

    Będzie to print 'hello-docker' na moja konsola i wychodzi

  2. Run z -itd flagi

    docker run -itd hello-docker 
    

    i jak poniżej mojego wyjścia konsoli, tym razem również będzie wychodzenia wkrótce. :( enter image description here

    • Różnica Widziałem to w Sekcja komend podczas uruchamiania innych obrazów dowodzić sekcja pokazuje "/ bin/bash" i będzie kontynuowane w trybie wolnostojącym.

    • A kiedy biegnę mój obraz w pojemniku z sekcji skrypt komenda pokaże „/ bin/sh -c/usr/Loca” i Wyjdź.

    • chcę uruchomić pojemnika aż nie zatrzyma go ręcznie.

EDIT:

Po dodaniu instrukcji punkt_wejścia w Dockerfile, to nie będzie wykonać mój skrypt :(

FROM ubuntu:14.04 

ADD shell.sh /usr/local/bin/shell.sh 

RUN chmod 777 /usr/local/bin/shell.sh 

CMD /usr/local/bin/shell.sh 

ENTRYPOINT /bin/bash 

Zgodnie z dokumentacją Döcker here

CMD zostanie nadpisane podczas uruchamiania kontenera z alternatywnymi argumentami, więc jeśli uruchomię obraz dokowania z pewnymi argumentami, jak poniżej, nie wykonam instrukcji CMD. :(

sudo docker run -it --entrypoint=/bin/bash <imagename> 

Odpowiedz

3

Wreszcie w niektórych eksperymentach Dostałem mój najlepszy wynik jak poniżej

Nie ma nic złego w moim Dockerfile jak poniżej jest poprawny.

FROM ubuntu:14.04 

ADD shell.sh /usr/local/bin/shell.sh 

RUN chmod 777 /usr/local/bin/shell.sh 

CMD /usr/local/bin/shell.sh 

Co zrobić, aby uzyskać oczekiwany wynik jest po prostu dodać jeszcze jedno polecenie (/ bin/bash) w moim pliku skryptu powłoki, jak poniżej i Vola wszystko działa w moim najlepszy sposób.

#!/bin/bash 

echo “Hello-docker” > /usr/hello.txt 

/bin/bash 
4

Pojemnik doker będzie działać tak długo, jak CMD z Dockerfile trwa.

W twoim przypadku Twój CMD składa skrypcie powłoki zawierającej pojedynczą echo. Więc pojemnik wyjdzie po ukończeniu Echo.

Można zastąpić CMD, na przykład:

sudo docker run -it --entrypoint=/bin/bash <imagename> 

Ten rozpocznie interaktywną powłokę w pojemniku zamiast wykonywać swoje CMD. Twój kontener zostanie zamknięty, gdy tylko opuścisz tę powłokę.

Jeśli chcesz, aby Twój pojemnik pozostawał aktywny, musisz upewnić się, że Twój CMD nadal działa. Na przykład, dodając linię while true; do sleep 1; done do pliku shelli.sh, twój kontener wyświetli wiadomość hello i nic więcej nie zrobi, dopóki jej nie zatrzymasz (używając przystanku doków w innym terminalu).

Możesz otworzyć powłokę w uruchomionym pojemniku za pomocą docker exec -it <containername> bash. Jeśli wykonasz komendę ps ax, pokaże ci ona, że ​​twój shell.sh nadal działa wewnątrz kontenera.

+0

Ale to nie wykona instrukcji CMD, mój skrypt powłoki nie zostanie wykonany. :( –

+0

To jest poprawne, nie możesz mieć obu, jedyną inną opcją jest kontynuowanie działania 'CMD' Dodałem przykład do mojej odpowiedzi – NZD

+0

Ale chcę też wykonać mój skrypt, a ja Nie chcę tego robić ręcznie.To jest problem –

5

Można również zmodyfikować swój pierwszy Dockerfile, zastępując

CMD /usr/local/bin/shell.sh

przez

CMD /usr/local/bin/shell.sh ; sleep infinity

ten sposób skrypt nie kończą, a pojemnik pozostaje uruchomiony.

+0

To zadziała, ale po tym Jeśli przyłączę się z kontenerem i chcę coś sprawdzić, to nie zareaguje.Jak Jeśli wykonasz polecenie ls -l nic się nie stanie –

+0

Zamiast attach, możesz 'docker exec container_id__or_name ls -l' – user2915097

+0

Ale nadal mam wrażenie, że istnieje więcej sposobu na to, zamiast używać, infinity snu –