2016-03-21 10 views
4

Ich versuche, einen einfachen Andock-Container mit meiner Webanwendung zu installieren (ohne docker-Datei). Während des Tests würde ich immer einen Container mit der Option -t -i ausführen und dann den Tomcat-Dienst darin starten, indem ich ein Shell-Skript ausführe. Wie wenn ich in Produktion gehe, möchte ich die Option -t -i nicht mehr benutzen und brauche nur noch meinen Tomcat-Dienst, um zu starten und der einzige primäre Dienst zu sein.Wie führe ich einen Dienst auf einem Docker-Container aus?

Ich versuche, den Einstiegspunkt auf das Start-Skript zum Starten von Tomcat zeigen, aber der Container wird beendet, nachdem das Skript beendet ist. Wie führe ich einen Container aus, starte einen Service und behalte diesen Service als einzigen primären Service des Containers?

Hinweis: Ich habe einige Beiträge über Supervisor gelesen, bin mir aber nicht sicher, ob ich mein Image von Grund auf neu erstellen müsste, wenn ich diesen Weg gehe? Ich würde es lieber nicht machen.

Irgendwelche Vorschläge?

+1

Verwenden Sie das Flag "-d" – lamirap

Antwort

8

Wenn Sie eine Dockerfile haben, die ein Einstiegspunkt Muster verwendet, wird es in etwa so aussehen:

(Dockerfile)

FROM ubuntu 

...Some configuration steps... 

add start.sh /start.sh 

ENTRYPOINT ["/start.sh"] 

Alles, was Sie tun müssen, ist sicherzustellen, dass Ihr start.sh Skript ‚hängt‘ irgendwie. Einige Leute mögen es, die Syslogs zu reduzieren, aber das Tailen einer existierenden Datei funktioniert.

(start.sh)

#!/bin/bash 

service Your_Service_Or_Whatever start 
tail -f /var/log/dmesg 
1

Docker-Container werden standardmäßig gemäß der Konfiguration in den Bildern Dockerfile ausgeführt. Wenn Sie normalerweise einen Container mit dem Flag -i ausführen, lassen Sie STDIN offen, damit Sie auf den Container-Einstiegspunkt zugreifen können, oder es könnte eine Bash-Shell sein. Um das zu erreichen, was Sie wollen, können Sie den Container in einem getrennten Zustand ausführen, indem Sie Ihre Befehle direkt in Andock-Ausführung übergeben.

Dadurch wird der myapp-Container in einem getrennten Zustand ausgeführt und der als drittes Argument übergebene Befehl ausgeführt. Wenn der Befehl zu einem langlebigen Dienst führt, bleibt der Container so lange aktiv, wie der Dienst ist.

This is explained in detail in the docs.

+0

Den Container mit in losgelöstem mo de hilft mir nicht. Ich brauche ein Shell-Skript ausführen, um die erforderlichen Service zu erhalten begonnen und sobald die Shell-Skript endet, werden die Behälter verlässt ... Ich brauche den Behälter am Laufen zu halten den Dienst THATI beginnen als primäre Service –

+0

Sie müssen den Container in einem getrennten Status ausführen, der Dienst muss in dem Vordergrund ausgeführt werden, um es aktiv zu halten. Aus dem Speicher benötigen Sie etwas wie $ PATH_TO_TOMCAT/startup.sh run' –

+0

Versucht, dass es startet den Dienst und dann der Container existiert, was scheint zu passieren ist, dass es die Shell behandelt, die ich benutze, um den Dienst als primärer Dienst und nicht den eigentlichen Dienst zu starten, der gestartet wird. –

2

Eine kürzere Version:

FROM ubuntu 

...Some configuration steps... 

ENTRYPOINT ["/bin/sh", "-c", "while true; do sleep 1; done"] 

mit Docker Version 1.12.1 getestet, bauen 23cf638

Verwenden docker --version Ihre Version

, um herauszufinden,
Verwandte Themen