@@ -52,6 +52,7 @@ class DockerConfig(BaseModel):
52
52
build_timeout : float | None = None
53
53
strict_timeouts : bool = False
54
54
set_cpus : str | list [str ] | None = None
55
+ image_size : int | None = None
55
56
generator : RunParameters = RunParameters ()
56
57
solver : RunParameters = RunParameters ()
57
58
advanced_run_params : "AdvancedRunArgs | None" = None
@@ -82,6 +83,7 @@ def set_docker_config(config: DockerConfig) -> None:
82
83
if config .advanced_build_params is not None :
83
84
Image .build_kwargs = config .advanced_build_params .to_docker_args ()
84
85
Program .docker_config = config
86
+ Image .docker_config = config
85
87
86
88
87
89
class ProgramUiProxy (Protocol ):
@@ -107,6 +109,8 @@ class Image:
107
109
id : str
108
110
path : Path
109
111
112
+ docker_config : ClassVar [DockerConfig ] = DockerConfig ()
113
+
110
114
run_kwargs : ClassVar [dict [str , Any ]] = {
111
115
"network_mode" : "none" ,
112
116
}
@@ -183,7 +187,15 @@ async def build(
183
187
except APIError as e :
184
188
raise BuildError ("Docker APIError thrown while building." , detail = str (e )) from e
185
189
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
187
199
188
200
def __enter__ (self ):
189
201
return self
0 commit comments