diff --git a/arch/tools/cli/core.py b/arch/tools/cli/core.py index 65cf2837..c91120df 100644 --- a/arch/tools/cli/core.py +++ b/arch/tools/cli/core.py @@ -4,7 +4,8 @@ import time import sys import glob import docker -from cli.utils import getLogger +from docker.errors import DockerException +from cli.utils import getLogger, update_docker_host_env from cli.consts import ( ARCHGW_DOCKER_IMAGE, ARCHGW_DOCKER_NAME, @@ -110,7 +111,12 @@ def start_arch(arch_config_file, env, log_timeout=120, foreground=False): log.info("Starting arch gateway") try: - client = docker.from_env() + try: + client = docker.from_env() + except DockerException as e: + # try setting up the docker host environment variable and retry + update_docker_host_env() + client = docker.from_env() try: container = client.containers.get("archgw") diff --git a/arch/tools/cli/utils.py b/arch/tools/cli/utils.py index 71ee7f70..8e8b234d 100644 --- a/arch/tools/cli/utils.py +++ b/arch/tools/cli/utils.py @@ -1,6 +1,8 @@ +import os import yaml import logging import docker +from docker.errors import DockerException from cli.consts import ARCHGW_DOCKER_IMAGE, ARCHGW_DOCKER_NAME @@ -19,10 +21,32 @@ def getLogger(name="cli"): log = getLogger(__name__) +def update_docker_host_env(): + """ + Update DOCKER_HOST environment variable to use the local Docker socket + """ + if os.getenv("DOCKER_HOST"): + return + + default_docker_socket = os.getenv("DEFAULT_DOCKER_SOCKET", "/var/run/docker.sock") + if not os.path.exists(default_docker_socket): + home_dir = os.getenv("HOME") + docker_host = f"unix://{home_dir}/.docker/run/docker.sock" + log.info( + f"Default docker socket {default_docker_socket} not found, using {docker_host}" + ) + os.environ["DOCKER_HOST"] = docker_host + + def validate_schema(arch_config_file: str) -> None: try: - client = docker.from_env() - # Run the container with detach=True to avoid blocking main process + try: + client = docker.from_env() + except DockerException as e: + # try setting up the docker host environment variable and retry + update_docker_host_env() + client = docker.from_env() + container = client.containers.run( image=ARCHGW_DOCKER_IMAGE, volumes={