diff --git a/samcli/cli/global_config.py b/samcli/cli/global_config.py index f628091ffbd..f4bc3e0d7d7 100644 --- a/samcli/cli/global_config.py +++ b/samcli/cli/global_config.py @@ -65,6 +65,9 @@ class GlobalConfig(metaclass=Singleton): # Env var used by docker client to specify which socket to use DOCKER_HOST_ENV_VAR: str = "DOCKER_HOST" + # Env var used to override docker API version to use + DOCKER_API_ENV_VAR: str = "SAM_DOCKER_API_VERSION" + # Static singleton instance _access_lock: threading.RLock diff --git a/samcli/local/docker/container_client.py b/samcli/local/docker/container_client.py index a8388d47c08..6b127802d7c 100644 --- a/samcli/local/docker/container_client.py +++ b/samcli/local/docker/container_client.py @@ -32,6 +32,7 @@ import docker from docker.utils import kwargs_from_env +from samcli.cli.global_config import GlobalConfig from samcli.lib.constants import DOCKER_MIN_API_VERSION, DOCKER_MIN_API_VERSION_FALLBACK from samcli.local.docker.exceptions import ContainerArchiveImageLoadFailedException, ContainerInvalidSocketPathException from samcli.local.docker.platform_config import get_finch_socket_path @@ -94,7 +95,7 @@ def __init__(self, base_url=None): self.client_params["base_url"] = base_url # Specify minimum version - self.client_params["version"] = DOCKER_MIN_API_VERSION + self.client_params["version"] = os.environ.get(GlobalConfig.DOCKER_API_ENV_VAR, DOCKER_MIN_API_VERSION) # Initialize DockerClient with processed parameters LOG.debug(f"Creating container client with parameters: {self.client_params}") diff --git a/tests/unit/local/docker/test_container_client.py b/tests/unit/local/docker/test_container_client.py index 1b1e4b73f4d..a4e757818fa 100644 --- a/tests/unit/local/docker/test_container_client.py +++ b/tests/unit/local/docker/test_container_client.py @@ -13,6 +13,7 @@ import docker from parameterized import parameterized +from samcli.cli.global_config import GlobalConfig from samcli.local.docker.container_client import ( ContainerClient, DockerContainerClient, @@ -749,6 +750,19 @@ def test_init_with_base_url_override(self, mock_log, mock_docker_init): self.assertEqual(call_kwargs["base_url"], override_url) self.assertTrue(mock_log.debug.called) + @patch("docker.DockerClient.__init__", return_value=None) + def test_init_with_api_override(self, mock_docker_init): + """Test ContainerClient init with api override""" + override_api = "1.51" + + with patch.dict("os.environ", {GlobalConfig.DOCKER_API_ENV_VAR: override_api}, clear=True): + client = ConcreteContainerClient() + + # Verify DockerClient.__init__ was called with expected parameters + mock_docker_init.assert_called_once() + call_kwargs = mock_docker_init.call_args.kwargs + self.assertEqual(call_kwargs["version"], override_api) + class TestContainerClientBaseClass(TestCase): """Test the ContainerClient base class methods"""