2
votes

Impossible de se connecter à un service gRPC exécuté dans le conteneur Docker local

J'ai lu la réponse à [cette question similaire] [1] mais cela n'a pas aidé à résoudre le problème pour moi.

Ma configuration:

  • un service gRPC distant;
  • un client .py qui s'exécute directement sur l'hôte .

Dans cette configuration, tout fonctionne correctement. Cependant, si je démarre ce service gRPC distant dans le conteneur Docker local (le client .py fonctionne toujours localement ):

debug_error_string = "{"created":"@1550580085.678869000","description":"Error received from peer","file":"src/core/lib/surface/call.cc","file_line":1036,"grpc_message":"Socket closed","grpc_status":14}"
``` so I assume something is wrong with my gRPC service image / Docker flags.


  [1]: https://stackoverflow.com/questions/43911793/cannot-connect-to-go-grpc-server-running-in-local-docker-container
  [2]: https://github.com/crccheck/docker-hello-world

La commande que j'utilise pour exécuter un service gRPC: sudo docker run --rm -it -u dud --net = host --entrypoint = / usr / local / bin / application COOL_APP

Voici un extrait de code de mon client .py :

user-dev:~ user$ lsof -i tcp:8080
COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
myservice 53941 user    6u  IPv4 0x40c50fcf1d04701d      0t0  TCP localhost:http-alt (LISTEN)
user-dev:~ user$ lsof -i tcp:9000

Je reçois l'erreur suivante (AFAIK cela signifie que mon client .py n'a pas pu se connecter à host: port de mon service Docker):

Traceback (most recent call last):
  File "client.py", line 31, in <module>
    for record in reader:
  File "/usr/local/lib/python2.7/site-packages/grpc/_channel.py", line 367, in next
    return self._next()
  File "/usr/local/lib/python2.7/site-packages/grpc/_channel.py", line 358, in _next
    raise self
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
    status = StatusCode.UNAVAILABLE
    details = "Connect Failed"
    debug_error_string = "{"created":"@1550567018.554830000","description":"Failed to create subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":2261,"referenced_errors":[{"created":"@1550567018.554828000","description":"Pick Cancelled","file":"src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc","file_line":245,"referenced_errors":[{"created":"@1550567018.554798000","description":"Connect Failed","file":"src/core/ext/filters/client_channel/subchannel.cc","file_line":867,"grpc_status":14,"referenced_errors":[{"created":"@1550567018.554789000","description":"Failed to connect to remote host: OS Error","errno":61,"file":"src/core/lib/iomgr/tcp_client_posix.cc","file_line":207,"os_error":"Connection refused","syscall":"connect","target_address":"ipv6:[::1]:9000"}]}]}]}"

J'ai essayé de définir à la fois localhost: 9000 , 0.0.0.0:9000 et : 9000 dans mon client .py et cela n'a pas fonctionné.

Je ne sais pas si cela a du sens, mais quand je lance:

XXX

Autrement dit, mon terminal n'affiche rien pour tcp: 9000 (j'exécute la commande ci-dessus pour vérifier si quelque chose écoute réellement localhost: 9000 ).

Mise à jour: quand je lance un hello-world [container] [2] avec -p 9000: 9000 je reçois un erreur différente:

HOST = 'localhost'
PORT = '9000'
with grpc.insecure_channel('{}:{}'.format(HOST, PORT)) as channel:


1 commentaires

Où est le client en cours d'exécution; directement sur l'hôte ou dans un autre conteneur?


3 Réponses :


1
votes

Vous devez dire à docker d'exposer le port en externe.

Essayez d'ajouter -p 9000: 9000 à votre commande d'exécution du docker.


1 commentaires

Cela a tout à fait du sens, mais ne fonctionne pas: j'ai essayé localhost: 9000 , 0.0.0.0:9000 et : 9000 en tant que hôte: port , et l'erreur reste la même.



1
votes

La bonne commande était:

docker run -p 9000:9000 -it -u dud --entrypoint=/usr/local/bin/application COOL_APP

Basiquement utilisée -p 9000: 9000 et supprimée --net = host . p>


0 commentaires

0
votes

Votre adresse IP d'hôte n'est pas localhost , mais c'est l'adresse IP de docker . Vous pouvez trouver l'IP du docker par "docker network inspect bridge | grep IPv4Address"


0 commentaires