Skip to content

Commit ae6b727

Browse files
authored
Merge pull request #96 from ImogenBits/size_limit
Add docker image size limit
2 parents fce02d0 + 089e481 commit ae6b727

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

algobattle/docker_util.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class DockerConfig(BaseModel):
5252
build_timeout: float | None = None
5353
strict_timeouts: bool = False
5454
set_cpus: str | list[str] | None = None
55+
image_size: int | None = None
5556
generator: RunParameters = RunParameters()
5657
solver: RunParameters = RunParameters()
5758
advanced_run_params: "AdvancedRunArgs | None" = None
@@ -82,6 +83,7 @@ def set_docker_config(config: DockerConfig) -> None:
8283
if config.advanced_build_params is not None:
8384
Image.build_kwargs = config.advanced_build_params.to_docker_args()
8485
Program.docker_config = config
86+
Image.docker_config = config
8587

8688

8789
class ProgramUiProxy(Protocol):
@@ -107,6 +109,8 @@ class Image:
107109
id: str
108110
path: Path
109111

112+
docker_config: ClassVar[DockerConfig] = DockerConfig()
113+
110114
run_kwargs: ClassVar[dict[str, Any]] = {
111115
"network_mode": "none",
112116
}
@@ -183,7 +187,15 @@ async def build(
183187
except APIError as e:
184188
raise BuildError("Docker APIError thrown while building.", detail=str(e)) from e
185189

186-
return cls(cast(str, image.id), path=path)
190+
self = cls(cast(str, image.id), path=path)
191+
size_limit = cls.docker_config.image_size
192+
used_size = cast(dict[str, Any], image.attrs).get("Size", 0)
193+
if size_limit is not None and used_size > size_limit:
194+
try:
195+
self.remove()
196+
finally:
197+
raise BuildError("Built image is too large.", detail=f"Built size: {used_size}, limit: {size_limit}.")
198+
return self
187199

188200
def __enter__(self):
189201
return self

0 commit comments

Comments
 (0)