Django 频道取消错误

时间:2020-12-20 14:02:39

标签: django django-channels django-redis

我正在使用 docker 在服务器上运行 django 项目。但是,不知何故,在我添加新函数 check_docker_container_status 来检查容器后发现了以下错误。这是来自哨兵的错误,我的 django 上没有错误日志。但是,问题出在不知何故我们的服务器也因为这个 CancelledError.

CancelledError: null
  File "channels/http.py", line 192, in __call__
    await self.handle(body_stream)
  File "asgiref/sync.py", line 304, in __call__
    ret = await asyncio.wait_for(future, timeout=None)
  File "asyncio/tasks.py", line 414, in wait_for
    return await fut

sentry error

正在尝试创建 docker ssh 连接。

from channels.generic.websocket import WebsocketConsumer


class DockerSSH(WebsocketConsumer):

    def connect(self):
        self.accept()
        ....

        try:
            self.client.inspect_image(full_image_name)
        except docker.errors.ImageNotFound:
            pull_docker_image(self.client, full_image_name)

        container_id, container_is_running = check_docker_container_status(self.client, container_name)

def close(self, close_code):
    logger.debug("### onclose triggered")
    self.disconnect(1)

def disconnect(self, close_code):
    # Close Thread
    self.stop_thread = True

    # Close Socket
    if self.tls:
        self.socket.sendall('stop\r\n'.encode('utf-8'))
    else:
        self.socket._sock.send('stop\r\n'.encode('utf-8'))

    logger.debug("### Closing the socket and containers")
    # socket close
    self.socket.close()

    # Clean up the container
    self.client.stop(self.container_id)
    self.client.wait(self.container_id)
    self.client.remove_container(self.container_id)
    logger.info("## Stopped the container: " + str(self.container_id.encode('utf-8')))


    # Close the client connection
    self.client.close()

check_docker_container_status 的函数是:

def check_docker_container_status(client, container_name):
    # print(dir(client))
    """
    ['__attrs__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_attach_params', '_attach_websocket', '_auth_configs', '_check_is_tty', '_create_websocket_connection', '_delete', '_disable_socket_timeout', '_general_configs', '_get', '_get_raw_response_socket', '_get_result', '_get_result_tty', '_multiplexed_buffer_helper', '_multiplexed_response_stream_helper', '_post', '_post_json', '_proxy_configs', '_put', '_raise_for_status', '_read_from_socket', '_result', '_retrieve_server_version', '_set_auth_headers', '_set_request_timeout', '_stream_helper', '_stream_raw_result', '_unmount', '_url', '_version', 'adapters', 'api_version', 'attach', 'attach_socket', 'auth', 'base_url', 'build', 'cert', 'close', 'commit', 'configs', 'configure_plugin', 'connect_container_to_network', 'containers', 'cookies', 'create_config', 'create_container', 'create_container_config', 'create_container_from_config', 'create_endpoint_config', 'create_host_config', 'create_network', 'create_networking_config', 'create_plugin', 'create_secret', 'create_service', 'create_swarm_spec', 'create_volume', 'credstore_env', 'delete', 'df', 'diff', 'disable_plugin', 'disconnect_container_from_network', 'enable_plugin', 'events', 'exec_create', 'exec_inspect', 'exec_resize', 'exec_start', 'export', 'get', 'get_adapter', 'get_archive', 'get_image', 'get_redirect_target', 'get_unlock_key', 'head', 'headers', 'history', 'hooks', 'images', 'import_image', 'import_image_from_data', 'import_image_from_file', 'import_image_from_image', 'import_image_from_stream', 'import_image_from_url', 'info', 'init_swarm', 'inspect_config', 'inspect_container', 'inspect_distribution', 'inspect_image', 'inspect_network', 'inspect_node', 'inspect_plugin', 'inspect_secret', 'inspect_service', 'inspect_swarm', 'inspect_task', 'inspect_volume', 'join_swarm', 'kill', 'leave_swarm', 'load_image', 'login', 'logs', 'max_redirects', 'merge_environment_settings', 'mount', 'networks', 'nodes', 'options', 'params', 'patch', 'pause', 'ping', 'plugin_privileges', 'plugins', 'port', 'post', 'prepare_request', 'proxies', 'prune_builds', 'prune_containers', 'prune_images', 'prune_networks', 'prune_volumes', 'pull', 'pull_plugin', 'push', 'push_plugin', 'put', 'put_archive', 'rebuild_auth', 'rebuild_method', 'rebuild_proxies', 'reload_config', 'remove_config', 'remove_container', 'remove_image', 'remove_network', 'remove_node', 'remove_plugin', 'remove_secret', 'remove_service', 'remove_volume', 'rename', 'request', 'resize', 'resolve_redirects', 'restart', 'search', 'secrets', 'send', 'service_logs', 'services', 'should_strip_auth', 'ssl_version', 'start', 'stats', 'stop', 'stream', 'tag', 'tasks', 'timeout', 'top', 'trust_env', 'unlock_swarm', 'unpause', 'update_container', 'update_node', 'update_service', 'update_swarm', 'upgrade_plugin', 'verify', 'version', 'volumes', 'wait']
    """
    #response = client.containers(filters={'name': container_name, 'status': 'running'},)
    response = client.containers(filters={'name': container_name},)

    if response:
        #  container = DOCKER_CLIENT.containers.get(container_name)
        # containers(quiet=False, all=False, trunc=False, latest=False, since=None, before=None, limit=-1, size=False, filters=None)
        # print(f"#############  Response from the Docker client is {response}")
        #print(dir(response))
        """
        [{'Id': 'd47ade9be6cd04f6d1xxxxx', 
         'Names': ['/xxxx-box-XXIMRANX'], 
         'Image': 'registry.gitlab.com/xxx:staging', 
         'ImageID': 'sha256:14e92c5cea25xxxx', 
         'Command': 'docker-entrypoint.sh bin/bash', 
         'Created': 1607615273, 
         'Ports': [], 
         'Labels': {'id': 'xxxx', 'maintainer': 'info@xxxx.com', 'user': 'superadmin'}, 'State': 'running', 
         'Status': 'Up 5 minutes', 
         'HostConfig': {'NetworkMode': 'lab'}, 
         'NetworkSettings': {'Networks': {'lab': {'IPAMConfig': None, 'Links': None, 'Aliases': None, 'NetworkID': '6e81c27f56af231e1xxxxx', 'EndpointID': 'aba544c4135025e5f9bae0xxxxx', 'Gateway': '', 'IPAddress': '10.222.xxx.xxx', 'IPPrefixLen': 32, 'IPv6Gateway': '', 'GlobalIPv6Address': '', 'GlobalIPv6PrefixLen': 0, 'MacAddress': '', 'DriverOpts': None}}},
         'Mounts': []}]
        """
        container_state = response[0]['State']
        container_is_running = container_state == 'running'
        container_id = str(response[0]['Id'])
        logging.debug(container_is_running)
        return container_id, container_is_running
    else:
        return None, False

0 个答案:

没有答案
相关问题