Skip to content

Commit 31cb620

Browse files
dimakrsoyacz
authored andcommitted
fix(docker_remote.py): login to Dockerhub and pull image under the same context
The change adjusts RemoteDocker.pull_image method to log in to Docker hub and pull an image under the same user context. This prevents a scenario when the login is performed as a regular user, but the image pull is executed under the root user context, leading to an unauthenticated request from Docker hub perspective. Fixes: #10399
1 parent 792360c commit 31cb620

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

sdcm/utils/docker_remote.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,9 @@ def __str__(self):
157157
@cache
158158
def pull_image(node, image):
159159
# Login docker-hub before pull, in case node authentication is expired or not logged-in.
160-
docker_hub_login(remoter=node.remoter)
161-
prefix = "sudo" if node.is_docker else ""
162-
node.remoter.run(
163-
f'{prefix} docker pull {image}', verbose=True, retry=3)
160+
docker_hub_login(remoter=node.remoter, use_sudo=node.is_docker)
161+
remote_cmd = node.remoter.sudo if node.is_docker else node.remoter.run
162+
remote_cmd(f"docker pull {image}", verbose=True, retry=3)
164163

165164
def __enter__(self):
166165
return self

sdcm/utils/docker_utils.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -518,15 +518,22 @@ def get_docker_hub_credentials() -> dict:
518518
return KeyStore().get_docker_hub_credentials()
519519

520520

521-
def docker_hub_login(remoter: CommandRunner) -> None:
522-
docker_info = remoter.run("docker info", ignore_status=True)
521+
def docker_hub_login(remoter: CommandRunner, use_sudo: bool = False) -> None:
522+
"""
523+
Logs into Docker Hub (if not already logged in) using credentials from the KeyStore.
524+
525+
:param remoter: CommandRunner, command runner instance
526+
:param use_sudo: bool, whether to use sudo for remote commands. Optional, defaults to False.
527+
"""
528+
remote_cmd = remoter.sudo if use_sudo else remoter.run
529+
docker_info = remote_cmd("docker info", ignore_status=True)
523530
if docker_info.failed:
524531
remoter.log.error("Can't get docker info, probably there is no running Docker daemon on the host")
525532
return
526533
if match := re.search(r"^\s+Username: (.+)$", docker_info.stdout, re.MULTILINE):
527534
remoter.log.debug("Docker daemon is already logged in as `%s'.", match.group(1))
528535
return
529-
if "Podman Engine" in remoter.run("docker version", ignore_status=True).stdout:
536+
if "Podman Engine" in remote_cmd("docker version", ignore_status=True).stdout:
530537
remoter.log.info("When Podman daemon is used we don't login")
531538
return
532539
if not os.environ.get('JENKINS_URL'):
@@ -537,5 +544,5 @@ def docker_hub_login(remoter: CommandRunner) -> None:
537544
with remote_file(remoter=remoter, remote_path=password_file) as fobj:
538545
fobj.write(docker_hub_creds["password"])
539546
remoter.log.debug("Login to Docker Hub as `%s'", docker_hub_creds["username"])
540-
remoter.run(cmd=f"docker login --username {docker_hub_creds['username']} --password-stdin < '{password_file}'")
547+
remote_cmd(f"docker login --username {docker_hub_creds['username']} --password-stdin < '{password_file}'")
541548
remoter.run(f"rm '{password_file}'")

0 commit comments

Comments
 (0)