From 2193333029a29102d59c1478f66a214792cb02cc Mon Sep 17 00:00:00 2001 From: Charro Gruver Date: Tue, 4 Feb 2025 19:36:30 +0000 Subject: [PATCH 1/8] modify container_build.sh to add capability to use podman farm for multi-arch images Signed-off-by: Charro Gruver --- container_build.sh | 33 +++++++++++++++++++++++++++++---- multi-arch-targets.list | 2 ++ 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 multi-arch-targets.list diff --git a/container_build.sh b/container_build.sh index 51e567ae..ae3f05f8 100755 --- a/container_build.sh +++ b/container_build.sh @@ -93,7 +93,7 @@ parse_arguments() { rm_after_build="true" shift ;; - build|push) + build|push|multi-arch) command="$1" shift ;; @@ -116,12 +116,24 @@ process_all_targets() { done } +process_multi_arch_targets() { + for i in $(cat ./multi-arch-targets.list); do + build_multi_arch "$i" + done +} + +build_multi_arch() { + local target="$1" + podman farm build -t quay.io/ramalama/"$target" -f container-images/"$target"/Containerfile ./container-images +} + print_usage() { echo "Usage: $(basename "$0") [-h|--help] [-d] [target]" echo echo "Commands:" echo " build Build the container images" echo " push Push the container images" + echo " multi-arch Build and Push multi-arch images with podman farm" echo echo "Options:" echo " -d Some option description" @@ -149,12 +161,25 @@ main() { print_usage exit 1 fi + if [ "$command" = "multi-arch" ] && [ "$conman_bin" != "podman" ]; then + echo "Error: command 'multi-arch' only works with podman farm" + print_usage + exit 1 + fi target="${target:-all}" - if [ "$target" = "all" ]; then - process_all_targets "$command" "$option" + if [ "$command" = "multi-arch" ]; then + if [ "$target" = "all" ]; then + process_multi_arch_targets + else + build_multi_arch "$target" + fi else - build "container-images/$target" "$command" "$option" + if [ "$target" = "all" ]; then + process_all_targets "$command" "$option" + else + build "container-images/$target" "$command" "$option" + fi fi } diff --git a/multi-arch-targets.list b/multi-arch-targets.list new file mode 100644 index 00000000..9f3ff0cd --- /dev/null +++ b/multi-arch-targets.list @@ -0,0 +1,2 @@ +vulkan +ramalama From e7495266eca5e4a3993b9fbc341bb3b73a9e1b80 Mon Sep 17 00:00:00 2001 From: Charro Gruver Date: Tue, 4 Feb 2025 19:44:27 +0000 Subject: [PATCH 2/8] Modify Makefile to support multi-arch builds Signed-off-by: Charro Gruver --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 45eaa935..89f6b53f 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,8 @@ help: @echo @echo " - make build" @echo " - make build IMAGE=ramalama" + @echo " - make multi-arch" + @echo " - make multi-arch IMAGE=ramalama" @echo @echo "Build docs" @echo @@ -81,6 +83,10 @@ build: build_rm: ./container_build.sh -r build $(IMAGE) +.PHONY: build_multi_arch +build_multi_arch + ./container_build.sh multi-arch $(IMAGE) + .PHONY: install-docs install-docs: docs make -C docs install From 7ba4c953d1bdfb9e7fbec6aff328cdeffe3774fd Mon Sep 17 00:00:00 2001 From: Charro Gruver Date: Tue, 4 Feb 2025 19:47:47 +0000 Subject: [PATCH 3/8] Fix syntax error in Makefile Signed-off-by: Charro Gruver --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 89f6b53f..ee250471 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ build_rm: ./container_build.sh -r build $(IMAGE) .PHONY: build_multi_arch -build_multi_arch +build_multi_arch: ./container_build.sh multi-arch $(IMAGE) .PHONY: install-docs From cdb7130f7f73e7bf6122759caf99df56ac13fb95 Mon Sep 17 00:00:00 2001 From: Charro Gruver Date: Tue, 4 Feb 2025 20:19:32 +0000 Subject: [PATCH 4/8] simplify script for multi-arch support Signed-off-by: Charro Gruver --- container_build.sh | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/container_build.sh b/container_build.sh index ae3f05f8..01f29c50 100755 --- a/container_build.sh +++ b/container_build.sh @@ -27,7 +27,7 @@ add_build_platform() { fi conman_build+=("--platform" "$platform") - conman_build+=("-t" "quay.io/ramalama/$image_name") + conman_build+=("-t" "$REGISTRY_PATH/$image_name") conman_build+=("-f" "$image_name/Containerfile" ".") } @@ -41,7 +41,7 @@ build() { cd "container-images" local image_name="${1//container-images\//}" local conman_build=("${conman[@]}") - local conman_show_size=("${conman[@]}" "images" "--filter" "reference='quay.io/ramalama/$image_name'") + local conman_show_size=("${conman[@]}" "images" "--filter" "reference='$REGISTRY_PATH/$image_name'") if [ "$3" == "-d" ]; then add_build_platform echo "${conman_build[@]}" @@ -58,10 +58,13 @@ build() { rm_container_image ;; push) - "${conman[@]}" push "quay.io/ramalama/$image_name" + "${conman[@]}" push "$REGISTRY_PATH/$image_name" + ;; + multi-arch) + podman farm build -t "$REGISTRY_PATH"/"$image_name" -f "$image_name"/Containerfile . ;; *) - echo "Invalid command: ${2:-}. Use 'build' or 'push'." + echo "Invalid command: ${2:-}. Use 'build', 'push' or 'multi-arch'." return 1 ;; esac @@ -112,21 +115,13 @@ process_all_targets() { if [ "$i" == "container-images/scripts" ]; then continue fi + if [ "$command" = "multi-arch" ] && [ !-f $"i"/.multi-arch ]; then + continue + fi build "$i" "$command" "$option" done } -process_multi_arch_targets() { - for i in $(cat ./multi-arch-targets.list); do - build_multi_arch "$i" - done -} - -build_multi_arch() { - local target="$1" - podman farm build -t quay.io/ramalama/"$target" -f container-images/"$target"/Containerfile ./container-images -} - print_usage() { echo "Usage: $(basename "$0") [-h|--help] [-d] [target]" echo @@ -142,6 +137,9 @@ print_usage() { echo "Targets:" echo " Specify the target container image to build or push" echo " If no target is specified, all container images will be processed" + echo "Destination Registry:" + echo " Override the target registry path by setting the env var REGISTRY_PATH" + echo " default - quay.io/ramalama" } main() { @@ -168,20 +166,13 @@ main() { fi target="${target:-all}" - if [ "$command" = "multi-arch" ]; then - if [ "$target" = "all" ]; then - process_multi_arch_targets - else - build_multi_arch "$target" - fi + if [ "$target" = "all" ]; then + process_all_targets "$command" "$option" else - if [ "$target" = "all" ]; then - process_all_targets "$command" "$option" - else - build "container-images/$target" "$command" "$option" - fi + build "container-images/$target" "$command" "$option" fi } +REGISTRY_PATH=${REGISTRY_PATH:-quay.io/ramalama} main "$@" From 8a187c65d2e82815204df0cf760eb8565533660f Mon Sep 17 00:00:00 2001 From: Charro Gruver Date: Tue, 4 Feb 2025 20:25:09 +0000 Subject: [PATCH 5/8] fix syntax error Signed-off-by: Charro Gruver --- container_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container_build.sh b/container_build.sh index 01f29c50..2b8a28ea 100755 --- a/container_build.sh +++ b/container_build.sh @@ -115,7 +115,7 @@ process_all_targets() { if [ "$i" == "container-images/scripts" ]; then continue fi - if [ "$command" = "multi-arch" ] && [ !-f $"i"/.multi-arch ]; then + if [ "$command" = "multi-arch" ] && [ ! -f "$i"/.multi-arch ]; then continue fi build "$i" "$command" "$option" From cf8030faaa093442a8255532d8cd9340d845301d Mon Sep 17 00:00:00 2001 From: Charro Gruver Date: Tue, 4 Feb 2025 20:27:41 +0000 Subject: [PATCH 6/8] add .multi-arch files to trigger podman farm build Signed-off-by: Charro Gruver --- container-images/ramalama/.multi-arch | 0 container-images/vulkan/.multi-arch | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 container-images/ramalama/.multi-arch create mode 100644 container-images/vulkan/.multi-arch diff --git a/container-images/ramalama/.multi-arch b/container-images/ramalama/.multi-arch new file mode 100644 index 00000000..e69de29b diff --git a/container-images/vulkan/.multi-arch b/container-images/vulkan/.multi-arch new file mode 100644 index 00000000..e69de29b From 71f26f4fc226e245062a024a57fc8f1bcfdb07d1 Mon Sep 17 00:00:00 2001 From: Charro Gruver Date: Tue, 4 Feb 2025 20:30:24 +0000 Subject: [PATCH 7/8] remove multi-arch-targets.list. Use the presence of .multi-arch in the image folder to trigger podman farm build Signed-off-by: Charro Gruver --- multi-arch-targets.list | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 multi-arch-targets.list diff --git a/multi-arch-targets.list b/multi-arch-targets.list deleted file mode 100644 index 9f3ff0cd..00000000 --- a/multi-arch-targets.list +++ /dev/null @@ -1,2 +0,0 @@ -vulkan -ramalama From 8e7dc3150c1c4cb84655b47345a6334620300f1f Mon Sep 17 00:00:00 2001 From: Charro Gruver Date: Tue, 4 Feb 2025 21:18:43 +0000 Subject: [PATCH 8/8] update logic to exclude certain images from multi-arch builds Signed-off-by: Charro Gruver --- container-images/ramalama/.multi-arch | 0 container-images/vulkan/.multi-arch | 0 container_build.sh | 9 +++++++-- 3 files changed, 7 insertions(+), 2 deletions(-) delete mode 100644 container-images/ramalama/.multi-arch delete mode 100644 container-images/vulkan/.multi-arch diff --git a/container-images/ramalama/.multi-arch b/container-images/ramalama/.multi-arch deleted file mode 100644 index e69de29b..00000000 diff --git a/container-images/vulkan/.multi-arch b/container-images/vulkan/.multi-arch deleted file mode 100644 index e69de29b..00000000 diff --git a/container_build.sh b/container_build.sh index 2b8a28ea..9b0b63aa 100755 --- a/container_build.sh +++ b/container_build.sh @@ -115,8 +115,13 @@ process_all_targets() { if [ "$i" == "container-images/scripts" ]; then continue fi - if [ "$command" = "multi-arch" ] && [ ! -f "$i"/.multi-arch ]; then - continue + # skip images that don't make sense for multi-arch builds + if [ "$command" = "multi-arch" ]; then + case "${i//container-images\//}" in + rocm|intel-gpu) + continue + ;; + esac fi build "$i" "$command" "$option" done