Tuve un pequeño problema con el socket ZeroMQ al intentar .bind() en la dirección 0.0.0.0:5555 , cuando intenté ejecutarlo en el contenedor Docker a través de Rancher Cattle.
Cada vez que intento ejecutarlo, obtengo el mismo error:
zmq.error.ZMQError: Dirección ya en uso.
Intenté hacer EXPOSE 5555 y EXPOSE 5555/tcp en mi Dockerfile, pero no me ayudó.
Aquí hay una parte de mi código:
... self.context = zmq.Context() self.socket = self.context.socket(zmq.PUB) self.socket.bind('tcp://%s:%d' % ('0.0.0.0', 5555)) ...Tal vez alguien tuvo el mismo problema. ¿Cómo resolverlo?
Asignación de una dirección local a un socket
Al asignar una dirección local a un socket usandozmq_bind()con el transportetcp://, el punto final se interpretará como una interfaz seguida de dos puntos y el número de puerto TCP a usar.
Una interfaz puede ser especificada por cualquiera de los siguientes:
- El comodín * , que significa todas las interfaces disponibles.
- La dirección IPv4 primaria asignada a la interfaz, en su representación numérica.
- El nombre de la interfaz tal como lo define el sistema operativo.
Los nombres de las interfaces no están estandarizados de ninguna manera y se debe suponer que son arbitrarios y dependen de la plataforma . En las plataformas Win32 no existen nombres de interfaz cortos, por lo que solo se puede usar la dirección IPv4 principal para especificar una interfaz.
Entonces, al menos uno debería hacer que el trabajo progrese.
Después de dos horas de depuración, traté de hacer .bind_to_random_port() y noté que mi aplicación en Docker se inicia a través de 4 trabajadores de Gunicorn . Entonces, después de que comenzó el primer trabajador, otros tres trabajadores no pueden vincularse al mismo puerto. Tenga en cuenta la vinculación a un solo puerto mientras tenga una aplicación de múltiples subprocesos o múltiples trabajadores.