import logging import os import platform import subprocess import time import docker import psutil from desktop_env.providers.base import Provider logger = logging.getLogger("desktopenv.providers.vmware.VMwareProvider") logger.setLevel(logging.INFO) WAIT_TIME = 3 class DockerProvider(Provider): def __init__(self, region: str): self.client = docker.from_env() self.vnc_port = self._get_available_port(8006) self.server_port = self._get_available_port(5000) # self.remote_debugging_port = self._get_available_port(1337) self.chromium_port = self._get_available_port(9222) self.environment = {"DISK_SIZE": "64G", "RAM_SIZE": "4G", "CPU_CORES": "2"} # Modify if needed @staticmethod def _get_available_port(port: int): while port < 65354: if port not in [conn.laddr.port for conn in psutil.net_connections()]: return port port += 1 def start_emulator(self, path_to_vm: str, headless: bool, os_type: str): # self.container = self.client.containers.run('qemux/qemu-docker', environment={"DISK_SIZE": "64G", "RAM_SIZE": "6G", "CPU_CORES": "8"}, volumes={"/Users/happysix/Programs/HKUNLP/Qemu/Ubuntu.qcow2": {"bind": "/Ubuntu.qcow2", "mode": "ro"}, "/Users/happysix/Programs/HKUNLP/Qemu/snapshot.qcow2": {"bind": "/boot.qcow2", "mode": "rw"}}, cap_add=["NET_ADMIN"], ports={8006: self.vnc_port, 5000: self.server_port}, detach=True) self.container = self.client.containers.run(path_to_vm, environment=self.environment, cap_add=["NET_ADMIN"], volumes={"/Users/happysix/Programs/HKUNLP/Qemu/Ubuntu.qcow2": {"bind": "/Ubuntu.qcow2", "mode": "ro"}}, ports={8006: self.vnc_port, 5000: self.server_port}, detach=True) def get_ip_address(self, path_to_vm: str) -> str: return f"localhost:{self.server_port}:{self.chromium_port}:{self.vnc_port}" def save_state(self, path_to_vm: str, snapshot_name: str): raise NotImplementedError("Not available for Docker.") def revert_to_snapshot(self, path_to_vm: str, snapshot_name: str): pass def stop_emulator(self, path_to_vm: str): logger.info("Stopping VM...") self.container.stop(WAIT_TIME) self.container.remove() # docker run -it --rm -e "DISK_SIZE=64G" -e "RAM_SIZE=8G" -e "CPU_CORES=8" --volume C:\Users\admin\Documents\Ubuntu.qcow2:/boot.qcow2 --cap-add NET_ADMIN --device /dev/kvm -p 8006:8006 -p 5000:5000 qemux/qemu-docker