2016-07-13 4 views
0

Ich bin neu in Docker und ich versuche, mein Python-Programm in einem Container auszuführen.Wie kann ich eine Verbindung zu einem Server mithilfe von Python-Sockets in einem Docker-Container herstellen?

Mein Programm muss sich über einen Socket mit einem Server verbinden, um einwandfrei zu funktionieren. Ich habe das Docker-Bild meines Programms und seinen entsprechenden Container erstellt, aber wenn es in die folgende Zeile kommt, schlägt es fehl, und ich habe keine Ahnung warum.

sock.connect((host, port)) 

Es zeigt diese Fehlermeldung:

[Errno -2] Name oder eine Dienstleistung nicht

Es läuft ganz gut außerhalb des containter bekannt. Vermutlich vermisse ich etwas wirklich Offensichtliches, aber ich kann es nicht sehen.

Vielen Dank im Voraus.

+2

was ist der Wert von 'host'? –

Antwort

2

Sofern Sie es nicht in Ihrer /etc/hosts Datei Ihres Andock-Containers eingerichtet haben, ist es unwahrscheinlich, dass Sie den richtigen Hostnamen eingerichtet haben.

Glücklicherweise bietet Docker eine gute Möglichkeit, diese Art von Informationen zwischen zwei Containern - Umgebungsvariablen - verfügbar zu machen. Sie werden automatisch angezeigt, wenn Sie zwei Container verknüpfen.

In einem Terminal:

$ docker run --name camelot -it -p 5000 --rm python 
Python 3.5.2 (default, Jul 8 2016, 19:17:03) 
[GCC 4.9.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import socketserver 
>>> 
>>> class MyHandler(socketserver.BaseRequestHandler): 
...  def handle(self): 
...   self.data = self.request.recv(2048).strip() 
...   print('{} wrote: '.format(self.client_address[0])) 
...   print(self.data) 
...   self.request.sendall(self.data.upper()) 
... 
>>> 
>>> server = socketserver.TCPServer(('0.0.0.0', 5000), MyHandler) 
>>> server.serve_forever() 

In einem zweiten:

$ docker run --rm -it --link camelot python 
Python 3.5.2 (default, Jul 8 2016, 19:17:03) 
[GCC 4.9.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> import socket 
>>> 
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
>>> s.connect((os.environ['CAMELOT_PORT_5000_TCP_ADDR'], 
...   int(os.environ['CAMELOT_PORT_5000_TCP_PORT']))) 
>>> s.send(b'Hey dude!') 
9 
>>> print(s.recv(2048)) 
b'HEY DUDE!' 
>>> s.close() 
+0

Vielen Dank. Ich habe den Fehler bereits gesehen. Ich habe die Variablen 'host' und' port' aus einer Konfigurationsdatei gelesen, die mein Container nicht erkennt. Ihre Antwort hat mir geholfen, das herauszufinden! – pespinal

+0

Wenn meine Antwort Ihr Problem gelöst hat, sollten Sie es als akzeptiert markieren, indem Sie auf das grüne Häkchen auf der linken Seite klicken. Wenn Sie eine nützliche/gut geschriebene Antwort finden, dann zögern Sie nicht, es zu verbessern :) –

Verwandte Themen