Skip to content

Commit ee30489

Browse files
dtsulikvicheey
andauthored
feat: custom image name support for Docker builds (aws#8382)
* feat: custom image name support for Docker builds * feat: add tests, fix name case * feat: add some easy tests --------- Co-authored-by: vicheey <181402101+vicheey@users.noreply.github.com>
1 parent a307e35 commit ee30489

2 files changed

Lines changed: 44 additions & 1 deletion

File tree

samcli/lib/build/app_builder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,8 @@ def _build_lambda_image(self, function_name: str, metadata: Dict, architecture:
430430
docker_context = cast(str, metadata.get("DockerContext"))
431431
# Have a default tag if not present.
432432
tag = metadata.get("DockerTag", "latest")
433-
docker_tag = f"{function_name.lower()}:{tag}"
433+
image_name = cast(str, metadata.get("DockerImage", function_name))
434+
docker_tag = f"{image_name.lower()}:{tag}"
434435
docker_build_target = metadata.get("DockerBuildTarget", None)
435436
docker_build_args = metadata.get("DockerBuildArgs", {})
436437

tests/unit/lib/build_module/test_app_builder.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1749,6 +1749,40 @@ def test_can_build_image_function(self):
17491749

17501750
self.assertEqual(result, "name:Tag")
17511751

1752+
def test_can_build_image_with_custom_name(self):
1753+
metadata = {
1754+
"Dockerfile": "Dockerfile",
1755+
"DockerContext": "context",
1756+
"DockerImage": "custom-Name_With-symbols-v1.2.3",
1757+
"DockerTag": "Tag",
1758+
"DockerBuildArgs": {"a": "b"},
1759+
}
1760+
1761+
self.container_client_mock.images.build.return_value = (Mock(), [])
1762+
1763+
result = self.builder._build_lambda_image("Name", metadata, X86_64)
1764+
1765+
self.assertEqual(result, "custom-name_with-symbols-v1.2.3:Tag")
1766+
1767+
def test_build_lambda_image_raises_for_non_dict_docker_build_args(self):
1768+
metadata = {
1769+
"Dockerfile": "Dockerfile",
1770+
"DockerContext": "context",
1771+
"DockerTag": "Tag",
1772+
"DockerBuildArgs": "not-a-dict",
1773+
}
1774+
with self.assertRaises(DockerBuildFailed):
1775+
self.builder._build_lambda_image("Name", metadata, X86_64)
1776+
1777+
def test_build_lambda_image_uses_latest_tag_when_not_specified(self):
1778+
metadata = {
1779+
"Dockerfile": "Dockerfile",
1780+
"DockerContext": "context",
1781+
}
1782+
self.container_client_mock.images.build.return_value = (Mock(), [])
1783+
result = self.builder._build_lambda_image("Name", metadata, X86_64)
1784+
self.assertEqual(result, "name:latest")
1785+
17521786
@patch("samcli.lib.build.app_builder.SDKBuildClient")
17531787
def test_lazy_initialization_creates_sdk_build_client_by_default(self, mock_sdk_build_client_class):
17541788
"""Test that _image_build_client is lazily initialized with SDKBuildClient when use_buildkit is False"""
@@ -3157,6 +3191,14 @@ def setUp(self, mock_get_validated_container_client):
31573191
def tearDown(self):
31583192
EventTracker.clear_trackers()
31593193

3194+
def test_must_raise_when_container_manager_is_none(self):
3195+
self.builder._container_manager = None
3196+
config = Mock()
3197+
with self.assertRaises(RuntimeError):
3198+
self.builder._build_function_on_container(
3199+
config, "source_dir", "artifacts_dir", "manifest_path", "runtime", X86_64, None
3200+
)
3201+
31603202
@patch(
31613203
"samcli.local.docker.container_client_factory.ContainerClientFactory.get_admin_container_preference",
31623204
return_value=None,

0 commit comments

Comments
 (0)