2017-11-12 3 views
0

Wenn ich meinen Container ausführen, versuche ich "Docker.py" aus dem Stammverzeichnis ("/") mit "/ usr/bin/python" auszuführen. Ich habe das Quell-Image überprüft, um sicherzustellen, dass die Python-Binärdatei existiert. Ich habe docker.py in das Docker-Image hochgeladen und es mit dieser Binärdatei erfolgreich ausgeführt. Wenn ich jedoch versuche, das Bild zu erstellen und dann das Bild auszuführen, bekomme ich diesen Fehler ("EOFError: EOF beim Lesen einer Zeile") und ich weiß nicht, was das bedeutet oder wo ich anfangen soll. Jede Hilfe wird geschätzt. Danke im Voraus!Docker Python-Skript wird nicht ordnungsgemäß ausgeführt

Katze docker.py

#!/usr/bin/python 
my_name = raw_input("Enter your name: ") 
print my_name 
quit() 

Katze Dockerfile

FROM python:2.7 
ADD docker.py /docker.py 
CMD ["/usr/bin/python", "/docker.py"] 

Docker zu bauen.

Sending build context to Docker daemon 175.8MB 
Step 1/3 : FROM python:2.7 
---> b1d5c2d7dda8 
Step 2/3 : ADD docker.py /docker.py 
---> f55a19158773 
Step 3/3 : CMD ["/usr/bin/python", "/docker.py"] 
---> Running in b830da5a2f5b 
---> ef5b878d203f 
Removing intermediate container b830da5a2f5b 
Successfully built ef5b878d203f 
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories. 

Docker Lauf ef5b878d203f

Enter your name: Traceback (most recent call last): 
    File "/docker.py", line 2, in <module> 
    my_name = raw_input("Enter your name: ") 
EOFError: EOF when reading a line 
+0

Wenn Sie das Terminal im Container verwenden möchten, verwenden Sie 'docker run' mit den' -ti' Argumenten. –

+0

Danke, das hat funktioniert. Nun, gibt es eine Möglichkeit, das Terminal im Container an einen Netzwerk-Socket anzuschließen, so dass Remote-Computer an das Python-Skript anhängen können, das ich in meinem Container ausführe und "interaktiv" damit über das Netzwerk arbeite? – Dan

+0

Ein Problem, eine Frage. –

Antwort

1

Das Problem ist, dass Ihr docker.py Skript Eingabe erwartet. Da @Klaus D. kommentierte, müssen Sie sich für den Befehl raw_input in einer interaktiven Shell befinden. Wenn Sie in einem Andock-Container arbeiten, gibt es keine interaktive Shell. Wenn Sie also raw_input ausführen, erhält das Kommando nur ein unerwartetes Ende, daher der Fehler, den Sie erhalten.

Sobald Sie den Container starten, ist es aus Benutzersicht wie eine kleine virtuelle Maschine, die einzige Interaktion, die Sie damit haben können, ist durch Methoden, die Sie innerhalb des Containers selbst eingerichtet haben. Oder aber in den Behälter einzutreten mit:

docker exec -it CONTAINER_HASH /bin/bash 

von dort aus haben Sie eine interaktive Shell bekam, und wenn Sie so melden Sie sich an, dann können Sie

python /docker.py 

laufen und es funktioniert wie man es erwarten würde.

+0

Danke KlausD und Jeff, ich verstehe. Ich habe versucht, meinen Container über einen Netzwerkanschluss freizulegen. Obwohl 'docker ps -a' anzeigt, dass der Container ausgeführt wird und der angeforderte Port verfügbar ist, kann ich den "Telnet-IP-Port" nicht herstellen, um eine Verbindung herzustellen. Wenn ich "nc IP Port" verwende, bekomme ich eine Verbindung, aber ich werde nicht proaktiv durch mein Skript aufgefordert, ich muss einige Daten eingeben, um etwas zurückzubekommen, gefolgt von einer unterbrochenen Pipe und nicht von den anderen aufgerufenen Aktionen für in meinem Skript. Ich habe auch einen xinetd-Dienst mit sehr ähnlichem Verhalten versucht. Ich kenne 1 Frage 1 Antwort, nur auf der Suche nach Richtung. – Dan

+0

Hallo Dan, das Problem hier ist wahrscheinlich, dass Ihr Container einen Dienst benötigt, der den von Ihnen offengelegten Port überwacht. Um dem Pfad zu folgen, auf dem Sie sich befinden, müsste der Container einen Dienst ausführen, der Ihre Anfrage hört Übergeben Sie dann die Anfrage an das Skript und geben Sie eine Antwort zurück. Der Hafen, der ausgesetzt wird, ist nicht genug, um zu tun, was Sie hoffen. Diese Frage hat einen netten Job gemacht, uns ein minimales Beispiel des Problems zu geben, aber ich vermute, dass Ihr Projekt größer ist als dieses Beispiel und um Ihnen einen Ratschlag für gute nächste Schritte zu geben, würde ich eine Beschreibung des Endziels brauchen. –

+0

Das macht Sinn also lassen Sie uns Container aus der Gleichung entfernen (https: // stackoverflow.com/questions/47244913/xinetd-service-python-script-doesnt-execute-richtig. Xinetd allein kann für meine Bedürfnisse ausreichen. Der Grund, warum ich mein Programm über ein Netzwerk verfügbar machen möchte, besteht darin, den Code selbst nicht über die interaktive Shell offenzulegen. Packungscode im Container, der einen Port freigibt und der xinetd-Dienst im Container hinter diesem Port aufgebaut wird, entspricht mehr oder weniger der von mir bereitgestellten Verbindung, vielleicht nur mit erhöhter Skalierbarkeit. Socket-Aktivierung könnte interessant sein, Benutzerpersistenz auch zu Container. – Dan

Verwandte Themen