2017-01-26 4 views
0

Ich bin neu in Docker und Container - Ich habe ein Python 3-Skript, das Daten von einer Website basierend auf Befehlszeilenparameter und druckt die Ergebnisse. Es verwendet Redis zum Zwischenspeichern von Daten, wenn keine Netzwerkverbindung verfügbar ist. Die Dockerfile Ich habe wie folgt aussiehtRunning Docker Skript-Anwendung in einem Container

FROM ubuntu:latest 
RUN apt-get update -y && apt-get -y install redis-server && apt-get install -y python3-pip python3.5-dev build-essential 
COPY . /app 
WORKDIR /app 
RUN pip3 install -r requirements.txt 
ENTRYPOINT ["python3"] 
CMD ["pn.py"] 

ich in der Lage bin, das Bild zu bauen, aber wenn ich die Container starten läuft es vermutlich den Python-Befehl, um das Skript im Innern des Behälters und Ausfahrten zu laufen, und als consquence I kann die Ergebnisse vom Host nicht sehen.

Das Skript erfordert Befehlszeileneingaben, andernfalls schlägt es fehl. Wie können diese als Teil eines einzelnen Docker-Ausführungsbefehls angegeben werden, den ich verwenden kann, um das Skript vom Host aus auszuführen?

Alternativ wie kann ich den Container ohne Aufruf des Skripts starten und stattdessen das Skript manuell im laufenden Container ausführen?

Antwort

1

Es hängt davon ab, was Sie mit den Ergebnissen tun möchten.

gelten folgende Voraussetzungen:

  • die ENTRYPOINT Linie zeigt das Bild, was ausgeführt werden soll, wenn Sie den Container starten. Das wird PID 1 sein.
  • Wenn diese Zeile existiert, wird der CMD Inhalt als Argument (en) zu ENTRYPOINT verwendet.
  • Docker-Container werden immer beendet, wenn ihre Hauptaufgabe (PID 1) beendet wird.

Im Grunde tut Ihr Docker, was es zu tun ist. Wenn Sie möchten, dass es weiterläuft, sollten Sie eine Aufgabe eingeben, die nicht als ENTRYPOINT oder CMD beendet wird (wenn ENTRYPOINT nicht vorhanden war).

Zur manuellen Einstellung der Container auf einem shell Modus starten und sehen, was passiert, können Sie es als laufen:

docker run -ti [OPTIONS] [CONTAINER_NAME] bash 

und dann werden Sie in einer Shell „in“ dem Behälter, so dass Sie laufen können das Skript manuell:

#~ python3 pn.py 
+0

OK danke. Der Befehl "apt-get -y install redis-server" in der zweiten Zeile der 'Dockerfile' soll' redis-server' installieren und automatisch starten, aber das funktioniert nicht. Nach dem Betreten des Containers sagt 'service redis-server status' mir, dass es nicht läuft. Dies geschieht sogar nachdem ich die 'Dockerfile' geändert habe, um die zusätzliche Zeile' service redis-server restart' unmittelbar nach der 'apt-get update'- und install-Zeile hinzuzufügen. Wie kann ich das beheben? – srm

+0

Sie haben das Konzept der 'Dockerfile' falsch verstanden. Sie erhalten keinen Dienst, der von einer Zeile zur nächsten läuft. Die 'Dockerfile' erstellt' Docker Images', die aus einem oder mehreren 'Layers' bestehen. Jede Zeile Ihrer 'Dockerfile' erstellt eine neue Ebene. Stellen Sie sich das als statische Mitglieder einer Klasse vor, und das resultierende Bild ist eine Klasse. Der Container, nach dem Sie mit diesem Image arbeiten, ist eine Instanz dieser Klasse oder ein Objekt. Sie können nicht erwarten, dass Dienste beim Erstellen des Abbilds mit der Docker-Datei ausgeführt werden. –

+0

Auch würde ich die Zeile ändern 'RUN apt-get update-y && apt-get -y install redis-server && apt-get install -y python3-pip python3.5-dev build-essential' auf 'RUN apt- get update && apt-get install -y redis-server python3-pip python3.5-dev build-essential' zur Vereinfachung. –

Verwandte Themen