def _wait_for_port(self):
wait_port, image, res = self.p('wait_for_port'), self.p('image'), 1
if wait_port:
container_id = self._container.id
container_info = self._client.containers.get(container_id)
ip_address = container_info.attrs['NetworkSettings']['IPAddress']
unsupported_errors = [
(errno.EHOSTUNREACH,
'[{image}] Host {ip} cannot be reach. The container may exit abnormally. Container logs :\n{logs}')
]
with contextlib.closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
while res != 0:
res = sock.connect_ex((ip_address, wait_port))
logger.debug(
'[%s] Waiting for port %d to respond (code:%d => %s).',
image, wait_port, res, errorcode.get(res, '--')
)
unsupported_error = next((e[1] for e in unsupported_errors if e[0] == res), None)
if unsupported_error:
raise DockerContainerError(unsupported_error.format(
image=image,
port=wait_port,
signal=errorcode.get(res, '--'),
ip=ip_address,
logs=self._container.logs(stream=False).decode('utf-8')
))
time.sleep(0.1 if res != 0 else 0)
logger.debug('[%s] Port %d is now responding.', image, wait_port)
评论列表
文章目录