Skip to content

Commit b39a050

Browse files
committed
feat: add ability to pass docker build params in template
1 parent f0678ad commit b39a050

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

samcli/lib/build/app_builder.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ def _build_lambda_image(self, function_name: str, metadata: Dict, architecture:
434434
docker_tag = f"{image_name.lower()}:{tag}"
435435
docker_build_target = metadata.get("DockerBuildTarget", None)
436436
docker_build_args = metadata.get("DockerBuildArgs", {})
437+
docker_build_extra_params = metadata.get("DockerBuildExtraParams", None)
437438

438439
if not dockerfile or not docker_context:
439440
raise DockerBuildFailed("Docker file or Docker context metadata are missed.")
@@ -460,6 +461,8 @@ def _build_lambda_image(self, function_name: str, metadata: Dict, architecture:
460461
}
461462
if docker_build_target:
462463
build_args["target"] = cast(str, docker_build_target)
464+
if docker_build_extra_params:
465+
build_args["extra_params"] = docker_build_extra_params
463466

464467
try:
465468
if not self._image_build_client:

samcli/lib/samlib/resource_metadata_normalizer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@
2525
IMAGE_ASSET_PROPERTY = "Code.ImageUri"
2626
ASSET_DOCKERFILE_PATH_KEY = "aws:asset:dockerfile-path"
2727
ASSET_DOCKERFILE_BUILD_ARGS_KEY = "aws:asset:docker-build-args"
28+
ASSET_DOCKER_BUILD_EXTRA_PARAMS_KEY = "aws:asset:docker-build-extra-params"
2829

2930
SAM_RESOURCE_ID_KEY = "SamResourceId"
3031
SAM_IS_NORMALIZED = "SamNormalized"
3132
SAM_METADATA_DOCKERFILE_KEY = "Dockerfile"
3233
SAM_METADATA_DOCKER_CONTEXT_KEY = "DockerContext"
3334
SAM_METADATA_DOCKER_BUILD_ARGS_KEY = "DockerBuildArgs"
35+
SAM_METADATA_DOCKER_BUILD_EXTRA_PARAMS_KEY = "DockerBuildExtraParams"
3436

3537
ASSET_BUNDLED_METADATA_KEY = "aws:asset:is-bundled"
3638
SAM_METADATA_SKIP_BUILD_KEY = "SkipBuild"
@@ -189,6 +191,7 @@ def _extract_image_asset_metadata(metadata):
189191
SAM_METADATA_DOCKERFILE_KEY: str(dockerfile_path.as_posix()),
190192
SAM_METADATA_DOCKER_CONTEXT_KEY: str(asset_path),
191193
SAM_METADATA_DOCKER_BUILD_ARGS_KEY: metadata.get(ASSET_DOCKERFILE_BUILD_ARGS_KEY, {}),
194+
SAM_METADATA_DOCKER_BUILD_EXTRA_PARAMS_KEY: metadata.get(ASSET_DOCKER_BUILD_EXTRA_PARAMS_KEY, None),
192195
}
193196

194197
@staticmethod

samcli/local/docker/image_build_client.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def build_image(
3939
platform: Optional[str] = None,
4040
target: Optional[str] = None,
4141
rm: bool = True,
42+
extra_params: Optional[list[str]] = None,
4243
) -> Generator[Dict[str, Any], None, None]:
4344
"""
4445
Build a container image from a Dockerfile.
@@ -59,6 +60,8 @@ def build_image(
5960
Build target stage in multi-stage Dockerfile
6061
rm : bool
6162
Remove intermediate containers after build (default: True)
63+
extra_params : list of str, optional
64+
Extra CLI flags (e.g., ["--ssh", "default"]). Only supported by CLIBuildClient
6265
6366
Yields
6467
------
@@ -119,6 +122,7 @@ def build_image(
119122
platform: Optional[str] = None,
120123
target: Optional[str] = None,
121124
rm: bool = True,
125+
extra_params: Optional[list[str]] = None,
122126
) -> Generator[Dict[str, Any], None, None]:
123127
"""Build image using docker-py SDK"""
124128
build_kwargs = {
@@ -135,6 +139,12 @@ def build_image(
135139
if target is not None:
136140
build_kwargs["target"] = target
137141

142+
if extra_params:
143+
LOG.warning(
144+
"DockerBuildExtraParams are not supported with the SDK build client and will be ignored. "
145+
"Use --use-buildkit to enable CLI-based builds."
146+
)
147+
138148
_, build_logs = self.container_client.images.build(**build_kwargs)
139149
return build_logs # type: ignore[no-any-return]
140150

@@ -159,6 +169,7 @@ def build_image(
159169
platform: Optional[str] = None,
160170
target: Optional[str] = None,
161171
rm: bool = True,
172+
extra_params: Optional[list[str]] = None,
162173
) -> Generator[Dict[str, Any], None, None]:
163174
# Make dockerfile path relative to context if not absolute
164175
if not os.path.isabs(dockerfile):
@@ -187,6 +198,9 @@ def build_image(
187198
if rm:
188199
cmd.append("--rm")
189200

201+
if extra_params:
202+
cmd.extend(extra_params)
203+
190204
cmd.append(path)
191205

192206
LOG.debug(f"Executing build command: {' '.join(cmd)}")

0 commit comments

Comments
 (0)