Update docker.py to support podman (#6778)

This commit is contained in:
David Thompson
2025-03-01 22:10:03 +00:00
committed by GitHub
parent 2db7a50e43
commit 78cc27a18f
3 changed files with 33 additions and 11 deletions

View File

@@ -19,19 +19,25 @@ class DockerRuntimeBuilder(RuntimeBuilder):
version_info = self.docker_client.version()
server_version = version_info.get('Version', '').replace('-', '.')
if tuple(map(int, server_version.split('.')[:2])) < (18, 9):
self.is_podman = version_info.get('Components')[0].get('Name').startswith('Podman')
if tuple(map(int, server_version.split('.')[:2])) < (18, 9) and not self.is_podman:
raise AgentRuntimeBuildError(
'Docker server version must be >= 18.09 to use BuildKit'
)
if self.is_podman and tuple(map(int, server_version.split('.')[:2])) < (4, 9):
raise AgentRuntimeBuildError(
'Podman server version must be >= 4.9.0'
)
self.rolling_logger = RollingLogger(max_lines=10)
@staticmethod
def check_buildx():
def check_buildx(is_podman: bool = False):
"""Check if Docker Buildx is available"""
try:
result = subprocess.run(
['docker', 'buildx', 'version'], capture_output=True, text=True
['docker' if not is_podman else 'podman', 'buildx', 'version'], capture_output=True, text=True
)
return result.returncode == 0
except FileNotFoundError:
@@ -68,12 +74,18 @@ class DockerRuntimeBuilder(RuntimeBuilder):
self.docker_client = docker.from_env()
version_info = self.docker_client.version()
server_version = version_info.get('Version', '').split('+')[0].replace('-', '.')
if tuple(map(int, server_version.split('.'))) < (18, 9):
self.is_podman = version_info.get('Components')[0].get('Name').startswith('Podman')
if tuple(map(int, server_version.split('.'))) < (18, 9) and not self.is_podman:
raise AgentRuntimeBuildError(
'Docker server version must be >= 18.09 to use BuildKit'
)
if not DockerRuntimeBuilder.check_buildx():
if self.is_podman and tuple(map(int, server_version.split('.'))) < (4, 9):
raise AgentRuntimeBuildError(
'Podman server version must be >= 4.9.0'
)
if not DockerRuntimeBuilder.check_buildx(self.is_podman):
# when running openhands in a container, there might not be a "docker"
# binary available, in which case we need to download docker binary.
# since the official openhands app image is built from debian, we use
@@ -110,7 +122,7 @@ class DockerRuntimeBuilder(RuntimeBuilder):
target_image_tag = tags[1].split(':')[1] if len(tags) > 1 else None
buildx_cmd = [
'docker',
'docker' if not self.is_podman else 'podman',
'buildx',
'build',
'--progress=plain',
@@ -139,7 +151,7 @@ class DockerRuntimeBuilder(RuntimeBuilder):
buildx_cmd.append(path) # must be last!
self.rolling_logger.start(
'================ DOCKER BUILD STARTED ================'
f'================ {buildx_cmd[0].upper()} BUILD STARTED ================'
)
try: