Skip to content

Commit 6d88aa1

Browse files
authored
[ACR] az acr login: Support Podman for --name parameter (#33115)
1 parent f38235a commit 6d88aa1

2 files changed

Lines changed: 27 additions & 10 deletions

File tree

src/azure-cli/azure/cli/command_modules/acr/check_health.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# --------------------------------------------------------------------------------------------
55

66
import re
7+
import json
78
from knack.util import CLIError
89
from knack.log import get_logger
910
from .custom import get_docker_command
@@ -73,11 +74,11 @@ def _subprocess_communicate(command_parts, shell=False):
7374

7475

7576
# Checks for the environment
76-
# Checks docker command, docker daemon, docker version and docker pull
77+
# Checks container command, daemon, version and image pull
7778
def _get_docker_status_and_version(ignore_errors, yes):
7879
from ._errors import DOCKER_DAEMON_ERROR, DOCKER_PULL_ERROR, DOCKER_VERSION_ERROR
7980

80-
# Docker command and docker daemon check
81+
# Container command and daemon check
8182
docker_command, error = get_docker_command(is_diagnostics_context=True)
8283
docker_daemon_available = True
8384

@@ -88,18 +89,31 @@ def _get_docker_status_and_version(ignore_errors, yes):
8889
docker_daemon_available = False
8990

9091
if docker_daemon_available:
91-
logger.warning("Docker daemon status: available")
92+
logger.warning("%s daemon status: available", docker_command.title())
9293

9394
# Docker version check
94-
output, warning, stderr, succeeded = _subprocess_communicate(
95-
[docker_command, "version", "--format", "'Docker version {{.Server.Version}}, "
96-
"build {{.Server.GitCommit}}, platform {{.Server.Os}}/{{.Server.Arch}}'"])
95+
output, warning, stderr, succeeded = _subprocess_communicate([docker_command, "version", "--format", "json"])
9796
if not succeeded:
9897
_handle_error(DOCKER_VERSION_ERROR.append_error_message(stderr), ignore_errors)
9998
else:
10099
if warning:
101100
logger.warning(warning)
102-
logger.warning("Docker version: %s", output)
101+
try:
102+
json_output = json.loads(output).get("Client")
103+
except json.decoder.JSONDecodeError:
104+
json_output = {}
105+
version = json_output.get("Version", "unknown")
106+
commit = json_output.get("GitCommit", "unknown")[:7]
107+
if docker_command == "docker":
108+
os = json_output.get("Os", "unknown")
109+
arch = json_output.get("Arch", "unknown")
110+
else:
111+
try:
112+
os, arch = json_output.get("OsArch", "unknown").split("/")
113+
except ValueError:
114+
os = "unknown"
115+
arch = "unknown"
116+
logger.warning("%s version: %s, build %s, platform %s/%s", docker_command.title(), version, commit, os, arch)
103117

104118
# Docker pull check - only if docker daemon is available
105119
if docker_daemon_available:
@@ -114,14 +128,14 @@ def _get_docker_status_and_version(ignore_errors, yes):
114128

115129
if not succeeded:
116130
if stderr and DOCKER_PULL_WRONG_PLATFORM in stderr:
117-
print_pass("Docker pull of '{}'".format(IMAGE))
131+
print_pass(f"{docker_command.title()} pull of '{IMAGE}'")
118132
logger.warning("Image '%s' can be pulled but cannot be used on this platform", IMAGE)
119133
return
120134
_handle_error(DOCKER_PULL_ERROR.append_error_message(stderr), ignore_errors)
121135
else:
122136
if warning:
123137
logger.warning(warning)
124-
print_pass("Docker pull of '{}'".format(IMAGE))
138+
print_pass(f"{docker_command.title()} pull of '{IMAGE}'")
125139

126140

127141
# Get current CLI version

src/azure-cli/azure/cli/command_modules/acr/custom.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import os
99
import re
10+
import shutil
1011
from knack.util import CLIError
1112
from knack.log import get_logger
1213
from azure.cli.core.azclierror import InvalidArgumentValueError, RequiredArgumentMissingError
@@ -396,6 +397,8 @@ def get_docker_command(is_diagnostics_context=False):
396397
docker_command = os.getenv('DOCKER_COMMAND')
397398
else:
398399
docker_command = 'docker'
400+
if not shutil.which('docker') and shutil.which('podman'):
401+
docker_command = 'podman'
399402

400403
from subprocess import PIPE, Popen, CalledProcessError
401404
try:
@@ -405,7 +408,7 @@ def get_docker_command(is_diagnostics_context=False):
405408
logger.debug("Could not run '%s' command. Exception: %s", docker_command, str(e))
406409
# The executable may not be discoverable in WSL so retry *.exe once
407410
try:
408-
docker_command = 'docker.exe'
411+
docker_command = f'{docker_command}.exe'
409412
p = Popen([docker_command, "ps"], stdout=PIPE, stderr=PIPE)
410413
_, stderr = p.communicate()
411414
except OSError as inner:

0 commit comments

Comments
 (0)