diff --git a/src/azure-cli/azure/cli/command_modules/acr/check_health.py b/src/azure-cli/azure/cli/command_modules/acr/check_health.py index bc997dacfa1..be15a7db581 100644 --- a/src/azure-cli/azure/cli/command_modules/acr/check_health.py +++ b/src/azure-cli/azure/cli/command_modules/acr/check_health.py @@ -4,6 +4,7 @@ # -------------------------------------------------------------------------------------------- import re +import json from knack.util import CLIError from knack.log import get_logger from .custom import get_docker_command @@ -88,18 +89,31 @@ def _get_docker_status_and_version(ignore_errors, yes): docker_daemon_available = False if docker_daemon_available: - logger.warning("Docker daemon status: available") + logger.warning("%s daemon status: available", docker_command.title()) # Docker version check - output, warning, stderr, succeeded = _subprocess_communicate( - [docker_command, "version", "--format", "'Docker version {{.Server.Version}}, " - "build {{.Server.GitCommit}}, platform {{.Server.Os}}/{{.Server.Arch}}'"]) + output, warning, stderr, succeeded = _subprocess_communicate([docker_command, "version", "--format", "json"]) if not succeeded: _handle_error(DOCKER_VERSION_ERROR.append_error_message(stderr), ignore_errors) else: if warning: logger.warning(warning) - logger.warning("Docker version: %s", output) + try: + json_output = json.loads(output).get("Client") + except json.decoder.JSONDecodeError: + json_output = {} + version = json_output.get("Version", "unknown") + commit = json_output.get("GitCommit", "unknown")[:7] + if docker_command == "docker": + os = json_output.get("Os", "unknown") + arch = json_output.get("Arch", "unknown") + else: + try: + os, arch = json_output.get("OsArch", "unknown").split("/") + except ValueError: + os = "unknown" + arch = "unknown" + logger.warning("%s version: %s, build %s, platform %s/%s", docker_command.title(), version, commit, os, arch) # Docker pull check - only if docker daemon is available if docker_daemon_available: @@ -114,14 +128,14 @@ def _get_docker_status_and_version(ignore_errors, yes): if not succeeded: if stderr and DOCKER_PULL_WRONG_PLATFORM in stderr: - print_pass("Docker pull of '{}'".format(IMAGE)) + print_pass(f"{docker_command.title()} pull of '{IMAGE}'") logger.warning("Image '%s' can be pulled but cannot be used on this platform", IMAGE) return _handle_error(DOCKER_PULL_ERROR.append_error_message(stderr), ignore_errors) else: if warning: logger.warning(warning) - print_pass("Docker pull of '{}'".format(IMAGE)) + print_pass(f"{docker_command.title()} pull of '{IMAGE}'") # Get current CLI version diff --git a/src/azure-cli/azure/cli/command_modules/acr/custom.py b/src/azure-cli/azure/cli/command_modules/acr/custom.py index a04ca43b904..84152828a8c 100644 --- a/src/azure-cli/azure/cli/command_modules/acr/custom.py +++ b/src/azure-cli/azure/cli/command_modules/acr/custom.py @@ -7,6 +7,7 @@ import os import re +import shutil from knack.util import CLIError from knack.log import get_logger from azure.cli.core.azclierror import InvalidArgumentValueError, RequiredArgumentMissingError @@ -396,6 +397,8 @@ def get_docker_command(is_diagnostics_context=False): docker_command = os.getenv('DOCKER_COMMAND') else: docker_command = 'docker' + if not shutil.which('docker') and shutil.which('podman'): + docker_command = 'podman' from subprocess import PIPE, Popen, CalledProcessError try: @@ -405,7 +408,7 @@ def get_docker_command(is_diagnostics_context=False): logger.debug("Could not run '%s' command. Exception: %s", docker_command, str(e)) # The executable may not be discoverable in WSL so retry *.exe once try: - docker_command = 'docker.exe' + docker_command = f'{docker_command}.exe' p = Popen([docker_command, "ps"], stdout=PIPE, stderr=PIPE) _, stderr = p.communicate() except OSError as inner: