2013-06-22 16 views
34

Przygotowuję prosty obraz: taki, który zawiera Riak (baza danych NoSQL). Obrazek uruchamia usługę Riak pod numerem riak start jako CMD. Teraz, jeśli uruchomię go jako demona z docker run -d quintenk/riak-dev, rozpocznie się proces Riak (widzę to w dziennikach). Jednak zamyka się automatycznie po kilku sekundach. Jeśli uruchomię go przy użyciu docker run -i -t quintenk/riak-dev /bin/bash, proces riak nie zostanie rozpoczęty (UPDATE: zobacz odpowiedzi na wyjaśnienie). W rzeczywistości żadna usługa nie działa. Mogę uruchomić go ręcznie za pomocą terminala, ale chciałbym, aby Riak uruchomił się automatycznie. Myślę, że to zachowanie wystąpiłoby również w innych serwisach, Riak jest tylko przykładem.Automatyczne uruchamianie usługi w kontenerze dokowania

Tak, uruchomienie/ponowne uruchomienie kontenera powinno automatycznie uruchomić Riak. Jakie jest właściwe podejście do ustawiania tego?


Dla odniesienia, tutaj jest Dockerfile z których można utworzyć obraz (aktualizacja: zmieniać za pomocą wybranego odpowiedź):

FROM ubuntu:12.04 
RUN apt-get update 
RUN apt-get install -y openssh-server curl 
RUN curl http://apt.basho.com/gpg/basho.apt.key | apt-key add - 
RUN bash -c "echo deb http://apt.basho.com precise main > /etc/apt/sources.list.d/basho.list" 
RUN apt-get update 
RUN apt-get -y install riak 
RUN perl -p -i -e 's/(?<=\{http,\s\[\s\{")127\.0\.0\.1/0.0.0.0/g' /etc/riak/app.config 
EXPOSE 8098 
CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1 

Edycja: -F zmieniona -F CMD zgodne do sesm jego uwaga


MY OWN ODPOWIEDŹ

Po pracy z Döcker przez jakiś czas nabrałem nawyku używania superwordurzysty, aby dostroić moje procesy. Jeśli chcesz podać przykładowy kod, sprawdź numer https://github.com/Krijger/docker-cookbooks. Używam obrazu mojego przełożonego jako bazy dla wszystkich moich innych obrazów. Napisałem na blogu używając opiekuna here.

+0

Przy okazji. Jestem teraz (dla celów programistycznych), używając kontenera, uruchamiając go, dołączając do niego, a następnie uruchamiając wiersz poleceń Riak. – qkrijger

Odpowiedz

41

Aby zachować działanie kontenerów w doku, należy zachować proces aktywny na pierwszym planie.

więc prawdopodobnie można zastąpić ten ostatni wiersz w swoim Dockerfile z

CMD /bin/riak console 

lub nawet

CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1 

Należy pamiętać, że nie można mieć wiele wierszy sprawozdania CMD, tylko ten ostatni dostaje biegać.

+0

Używam teraz drugiej opcji. Dziękujemy za twoją opinię! – qkrijger

4

Wyjaśnienie:

Jeśli uruchomić go za pomocą docker run -i -t quintenk/riak-dev /bin/bash proces riak nie jest uruchomiona

jest następujący. Używanie CMD w pliku Dockerfillu ma taką samą funkcjonalność jak uruchamianie kontenera przy użyciu docker run {image} {command}. Jak zauważył Gigablah, tylko ostatnia CMD jest używana, więc ta napisana w Dockerfile jest nadpisywana w tym przypadku.

Korzystając z CMD /bin/riak start && tail -f /var/log/riak/erlang.log.1 w pliku Buildfile, można uruchomić kontener jako proces w tle przy użyciu docker run -d {image}, który działa jak zawieszka.

+0

Podobnie próbuję dokować CDH. W takim przypadku uruchamiam usługę przy użyciu polecenia RUN. Zaczyna się i kończy po tym poleceniu RUN. Jaki mógł być powód? –

+0

@GopsAB Prawdopodobnie istnieje pewien błąd, który uniemożliwia uruchomienie głównego procesu (utrzymywania). Sprawdź swoje dzienniki lub wypróbuj CMD ręcznie, uruchamiając kontener za pomocą/bin/bash i sprawdzając, co się stanie – qkrijger

+0

Jeśli proces się zawiesza, tailf kontynuuje działanie. Ta sama historia co @damick –

31

Używanie ogona do utrzymania żywego pojemnika jest hackerem. Zauważ też, że z kontenerem opcji -f zakończy się, gdy nastąpi rotacja logu (można tego uniknąć, używając zamiast tego -F).

Lepszym rozwiązaniem jest użycie supervisor. Spójrz na to tutorial o uruchamianie Riaka w kontenerze Docker.

+3

To wygląda obiecująco. Jeśli masz już doświadczenie z korzystaniem z tego w połączeniu z funkcją dokowania, czy chciałbyś udostępnić tutaj krótki przykład? – qkrijger

3

Ponieważ chcę mieć czysty sposób na późniejsze wyjście z tego procesu, wykonuję ostatnie polecenie wywołanie powłoki read, co powoduje, że proces ten blokuje się, dopóki później nie dołączę do niego i nie naciśniesz klawisza Enter.

[email protected]:~/docker$ sudo docker run -d -t -i -v /raid:/raid -p 4040:4040 subsonic /bin/bash -c 'service subsonic start && read -p "waiting"' 
WARNING: Docker detected local DNS server on resolv.conf. Using default external servers: [8.8.8.8 8.8.4.4] 
f27229a260c9 

[email protected]:~/docker$ sudo docker ps                                  
[sudo] password for arthur: 
ID     IMAGE    COMMAND    CREATED    STATUS    PORTS 
35f253bdf45a  subsonic:latest  /bin/bash -c service 2 days ago   Up 2 days   4040->4040 

[email protected]:~/docker$ sudo docker attach 35f253bdf45a 

[email protected]:~/docker$ sudo docker ps                                  
ID     IMAGE    COMMAND    CREATED    STATUS    PORTS 

jak widać kontener wychodzi po dołączeniu do niego i odblokować odczyt. Można oczywiście użyć bardziej wyrafinowany skrypt niż read -p jeśli trzeba zrobić inny oczyścić, takich jak zatrzymywanie usług i zapisywanie logów itp

4

„Gdybym go uruchomić za pomocą run doker -i -t quintenk/riak-dev/bin/bash proces riak nie został rozpoczęty "

Wygląda na to, że chcesz monitorować dziennik tylko podczas dołączania do kontenera. Mój przypadek użycia jest nieco inny, ponieważ chcę, aby polecenia uruchamiały się automatycznie, ale chcę móc dołączyć do kontenera i być w powłoce basha. Udało mi się rozwiązać oba nasze problemy w następujący sposób:

W obrazie/pojemniku dodaj polecenia, które chcesz automatycznie uruchomić na końcu pliku /etc/bash.bashrc.

W twoim przypadku wystarczy dodać linię /bin/riak start && tail -F /var/log/riak/erlang.log.1 lub umieścić /bin/riak start i tail -F /var/log/riak/erlang.log.1 w oddzielnych liniach w zależności od pożądanej funkcjonalności.

Teraz zatwierdz zmiany w swoim kontenerze i uruchom je ponownie za pomocą: docker run -i -t quintenk/riak-dev /bin/bash. Przekonasz się, że polecenia, które umieściłeś w bashrc, są już uruchomione podczas dołączania.

+3

To naprawdę bardzo ładne rozwiązanie :) Zauważ, że 0.6.5 dodał, że opcja 'docker run -a' dla zgodności z superwizorami. Możesz też to wypróbować. – qkrijger

+0

Nie jest to dobre rozwiązanie. Co zrobisz, jeśli proces zakończy się, tailf będzie kontynuował działanie, kontener nie wyjdzie. –

+0

@ MincăDanielAndrei Masz rację częściowo. Nie jest to rozwiązanie gotowe do produkcji, nie jest ono trwałe z tego powodu, o którym wspomniałeś. Najlepiej, jeśli to możliwe, aby "punkt wejścia" lub "cmd" obrazu był procesem, który chcesz uruchomić. Często oznacza to, że musisz znaleźć opcję '--no-daemon' dla wspomnianego procesu, aby nie dopuścić do opuszczenia kontenera, gdy początkowe tła i wyjścia zostały zakończone oraz aby logować się do stderr/stdout. – damick

Powiązane problemy