Қызметті доккер контейнерінде автоматты түрде іске қосыңыз

Мен қарапайым сурет саламын: Riak (NoSQL дерекқоры) бар. Кескін Riak қызметін riak start арқылы CMD ретінде бастайды. Енді, мен оны docker run -d quintenk/riak-dev функциясымен іске қоссам, Riak процесін бастайды (бұл журналдарда көре аламын). Дегенмен, ол бірнеше секундтан кейін автоматты түрде жабылады. Егер мен оны docker run -i -t quintenk/riak-dev/bin/bash арқылы іске қоссам, тәртіпсіздік процесі басталмайды (UPDATE: бұл үшін түсініктеме жауаптарын қараңыз). Іс жүзінде, ешқандай қызмет мүлдем жұмыс істемейді. Мен оны терминал арқылы қолмен бастауға болады, бірақ мен Riak автоматты түрде іске қосқысы келеді. Мен бұл мінез-құлықтың басқа қызметтер үшін де кездесетінін түсінемін, Riak - бұл тек мысал.

So, running/restarting the container should automatically start Riak. What is the correct approach of setting this up?


For reference, here is the Dockerfile with which the image can be created (UPDATE: altered using the chosen answer):

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

EDIT: -f changed to -F in CMD in accordance to sesm his remark


MY OWN ANSWER

After working with Docker for some time I picked up the habit of using supervisord to tun my processes. If you would like example code for that, check out https://github.com/Krijger/docker-cookbooks. I use my supervisor image as a base for all my other images. I blogged on using supervisor here.

34
Айтпақшы. Қазір контейнерді қолданып, оны іске қосып, оны қосып, содан кейін Riak пәрмен жолын бастау арқылы (дамыту мақсатында).
қосылды автор qkrijger, көзі

6 жауаптар

To keep docker containers running, you need to keep a process active in the foreground.

So you could probably replace that last line in your Dockerfile with

CMD /bin/riak console

Or even

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

Сіз CMD мәлімдемелерінің бірнеше жолына ие бола алмайтыныңызды ескеріңіз, тек соңғы нұсқасы іске қосылады.

41
қосылды
Екінші нұсқаны пайдаланып жатырмын. Пікіріңізге рахмет!
қосылды автор qkrijger, көзі

Контейнерді тірі сақтау үшін құйрықты пайдалану - бұзылу. Сондай-ақ, -f опциясы бар контейнер журналдың айналуы орын алған кезде тоқтатылады (оның орнына -F арқылы жол берілмейді).

Жақсы шешім - жетекшісін пайдалану. Риакпен жұмыс істеу туралы осы оқулық туралы қараңыз Docker контейнерінде.

31
қосылды
Бұл болашағы зор. Егер сіз оны докермен бірге қолданып көрген болсаңыз, мұнда қысқа мысалмен бөліссеңіз болады ма?
қосылды автор qkrijger, көзі

Түсіндіру:

docker run -i -t quintenk/riak-dev/bin/bash арқылы іске қосылсаңыз, riak процесі басталмаған

төменде келтірілген. Dockerfile ішіндегі CMD пайдалану - бұл docker іске қосу {image} {command} арқылы контейнерді бастау сияқты бірдей функционалдылық. Гигабланың айтуынша, тек соңғы CMD пайдаланылады, сондықтан Dockerfile-де жазылған бұл жазба қайта жазылады.

By using CMD /bin/riak start && tail -f /var/log/riak/erlang.log.1 in the Buildfile, you can start the container as a background process using docker run -d {image}, which works like a charm.

4
қосылды
Сол сияқты, CDH-ні докеризациялауға тырысамын. Бұл жағдайда мен RUN командасы арқылы қызметті бастаймын. Ол RUN командасынан кейін басталады және шығады. Мұның себебі неде?
қосылды автор Gops AB, көзі
@GopsAB, ең басты процесті (сақтау) іске қосуға кедергі келтіретін қандай да бір қате болуы мүмкін. Контейнерді/bin/bash арқылы бастау арқылы журналыңызды тексеріңіз немесе CMD-ты қолмен тексеріңіз және не болатынын көріңіз
қосылды автор qkrijger, көзі
Процесс апатқа ұшыраса, артқы жағы іске қосылады. @Damick сияқты бірдей оқиға
қосылды автор Mincă Daniel Andrei, көзі

«Мен оны docker run -i -t quintenk/riak-dev/bin/bash арқылы іске қоссам, рикация процесі басталмады»

Сіз контейнерге тіркелген кезде ғана журналды бақылап отырғыңыз келеді. Менің пайдалану жағдайым әртүрлі болады, себебі мен командалар автоматты түрде жұмыс істей бастадым, бірақ контейнерге бекітіп, бэш қабығында болғым келеді. Мен біздің екі мәселені де шеше алдық:

Суретте/контейнерде автоматты түрде басталатын пәрмендерді /etc/bash.bashrc файлының соңына қосыңыз.

In your case just add the line /bin/riak start && tail -F /var/log/riak/erlang.log.1, or put /bin/riak start and tail -F /var/log/riak/erlang.log.1 on separate lines depending on the functionality desired.

Енді контейнерге жасалған өзгертулерді орындаңыз және оны келесі әрекеттерді орындаңыз: docker run -i -t quintenk/riak-dev/bin/bash . Сіз bashrc ішіне қойған пәрмендерді сіз бекітіп жатқанда іске қосылғанын табасыз.

4
қосылды
Бұл шын мәнінде өте жақсы шешім.) 0.6.5 екенін ескеріңіз, бұл docker run -a нұсқаушылардың үйлесімділігі үшін қосылды. Мүмкін сен де солай болғың келеді.
қосылды автор qkrijger, көзі
Жақсы шешім емес. Процесс шыққанда, не істесеңіз, артқы жағы жалғасады, контейнер шықпайды.
қосылды автор Mincă Daniel Andrei, көзі
dumb-init , контейнерлер үшін init жүйесінен басқа нұсқасы engineeringblog.yelp.com/2016/01/…
қосылды автор Mincă Daniel Andrei, көзі
@ MincăDanielAndrei Сіз ішінара құқығыңыз бар. Бұл өндіріске дайын шешім емес, бұл сіз айтқан себептерге байланысты тұрақты емес. Кескініңіздің entrypoint немесе cmd болуы мүмкін болса, ең жақсы, егер сіз оны іске қосқыңыз келсе. Жиі бұл контейнердің шығу нүктесінің фоны өзі шыққан және шығып, stderr/stdout жүйесіне кіру үшін шығу үшін, - no-daemon параметрін табу керек дегенді білдіреді.
қосылды автор damick, көзі

Процесті кейінірек шығудың таза жолын қалағандықтан, мен соңғы бұйрықты қабықшаның read деп шақыруды жасаймын, ол осы процесстің кейінірек оған қосылатынға дейін бұғатталуын тудырады және хит кіреді.

[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

контейнердің сіз оған бекітілгеннен кейін шығуларын көріп, оқуды бұғаттан шығарып тастаңыз. Сіз, әрине, read -p қарағанда күрделі сценарийді пайдалануға болады, егер сіз қызметтерді тоқтату және журналдарды сақтау және т.б.

3
қосылды

Мен жаңа докер контейнерін құрастыра бастағанда қарапайым қиялды қолданамын. Оны сақтау үшін кіру нүктесінің сценарийінде пингті қолданамын.

Мәселен, Docker файлында, мысалы, Debian пайдалану кезінде, мен пинг мүмкін деп сенімдімін. Бұл контейнерден қолжетімді болатын нәрсені тексеру үшін әрдайым жақсы, btw.

...
RUN DEBIAN_FRONTEND=noninteractive apt-get update \
 && apt-get install -y iputils-ping 
...
ENTRYPOINT ["entrypoint.sh"]

Және entrypoint.sh файлында

#!/bin/bash
...
ping 10.10.0.1 >/dev/null 2>/dev/null

Мен оны CMD bash орнына қолданамын, себебі мен әрдайым іске қосу файлын қолданамын.

0
қосылды