My Python 3.6 based container, running an asyncio server is not receiving incoming socket connections.
The same script running locally or inside a virtualenv works perfectly.
I’m using MacOS Sierra 10.12.5
Using Docker 17.03.1-ce-mac12
I’m using the code below replicates the issue also happening in a larger (real world) project I have.
A simple echo client / server setup.
# server.py
import asyncio
async def handle_echo(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print("Received %r from %r" % (message, addr))
print("Send: %r" % message)
writer.write(data)
await writer.drain()
print("Close the client socket")
writer.close()
loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, '127.0.0.1', 8888, loop=loop)
server = loop.run_until_complete(coro)
# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
loop.run_forever()
except KeyboardInterrupt:
pass
# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
#client.py
import asyncio
async def tcp_echo_client(message, loop, port):
reader, writer = await asyncio.open_connection('0.0.0.0', port, loop=loop)
print('Send: %r' % message)
writer.write(message.encode())
data = await reader.read(100)
print('Received: %r' % data.decode())
print('Close the socket')
writer.close()
message = 'Hello World!'
loop = asyncio.get_event_loop()
loop.run_until_complete(tcp_echo_client(message, loop, 8888))
loop.close()
Dockerfile
FROM python:3.6
RUN mkdir -p /app
ADD . /app
WORKDIR /app
EXPOSE 8888
ENTRYPOINT ["python", "server.py"]
Starting the container with
docker run -d -p 8888:8888 asyncio
Running the client.py script on my host machine, connecting to the container on port 8888.
I get the following:
Send: 'Hello World!'
Received: ''
Close the socket
Please try to replicate the above, and if anyone has any suggestions, ideas or comments, I’d be keen to know.