Build arm64 images by default and additionally do not require docker buildx for simple builds

This commit is contained in:
Kamil Trzciński 2022-10-28 07:38:23 +00:00 committed by Andrejs Cunskis
parent 66c6656f97
commit f6a1f0e63f
12 changed files with 128 additions and 84 deletions

View file

@ -5,12 +5,31 @@ IFS=$'\n\t'
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
source "$SCRIPT_DIR/custom-docker.sh"
function get_base_image_reference() {
if [[ $1 =~ ^debian ]]; then
echo "$1"
elif [[ $1 =~ ^ubi:8 ]]; then
echo "registry.access.redhat.com/ubi8/$1"
fi
function fail() {
echo "$@" 1>&2
exit 1
}
function print_image_args() {
declare -A CUSTOM_BASE_IMAGE
declare -A BUILD_OS
case "$1:$2" in
debian:*)
CUSTOM_BASE_IMAGE="$1:$2"
BUILD_OS=debian
;;
ubi:8.*)
CUSTOM_BASE_IMAGE="registry.access.redhat.com/ubi8/ubi:$2"
BUILD_OS=ubi
;;
*) fail "Unknown image version $1:$2" ;;
esac
printf -- "--build-arg CUSTOM_BASE_IMAGE=%s " "$CUSTOM_BASE_IMAGE"
printf -- "--build-arg BUILD_OS=%s " "$BUILD_OS"
}
function print_golang_args() {
@ -30,13 +49,13 @@ function print_golang_args() {
1.19)
INSTALL_GOLANG_VERSION=1.19.2
GOLANG_DOWNLOAD_SHA256[amd64]=5e8c5a74fe6470dd7e055a461acda8bb4050ead8c2df70f227e3ff7d8eb7eeb6
GOLANG_DOWNLOAD_SHA256[arm64]=62a8d9654436c67c14a0c91e931d50440541f09eb991a987536cb982903126d
GOLANG_DOWNLOAD_SHA256[arm64]=b62a8d9654436c67c14a0c91e931d50440541f09eb991a987536cb982903126d
;;
*) echo "Unknown golang version $1"; exit 1;
*) fail "Unknown golang version $1" ;;
esac
printf -- "--build-arg INSTALL_GOLANG_VERSION=%s " "$INSTALL_GOLANG_VERSION"
printf -- "--build-arg GOLANG_DOWNLOAD_SHA256=%s " "${GOLANG_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg GOLANG_DOWNLOAD_SHA256=%q " "${GOLANG_DOWNLOAD_SHA256[*]}"
}
# If you add a new minor version here, be sure to check that the
@ -54,7 +73,7 @@ function print_chrome_args() {
106|106.0)
CHROME_VERSION=106.0.5249.91-1
;;
*) echo "Unknown chrome version $1"; exit 1;
*) fail "Unknown chrome version $1" ;;
esac
printf -- "--build-arg CHROME_VERSION=%s " "$CHROME_VERSION"
}
@ -70,7 +89,7 @@ function print_git_args() {
GIT_VERSION=2.36.1
GIT_DOWNLOAD_SHA256=37d936fd17c81aa9ddd3dba4e56e88a45fa534ad0ba946454e8ce818760c6a2c
;;
*) echo "Unknown git version $1"; exit 1;
*) fail "Unknown git version $1" ;;
esac
case "$GIT_VERSION" in
@ -95,11 +114,11 @@ function print_lfs_args() {
LFS_DOWNLOAD_SHA256[amd64]=2a8e60cf51ec45aa0f4332aa0521d60ec75c76e485d13ebaeea915b9d70ea466
LFS_DOWNLOAD_SHA256[arm64]=ff2f8472a5ac0e808108bad0cc6be5ca1849eb970228b1aa3d627bcbc8228ad9
;;
*) echo "Unknown Git LFS version $1"; exit 1;
*) fail "Unknown Git LFS version $1" ;;
esac
printf -- "--build-arg LFS_VERSION=%s " "$LFS_VERSION"
printf -- "--build-arg LFS_DOWNLOAD_SHA256=%s " "${LFS_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg LFS_DOWNLOAD_SHA256=%q " "${LFS_DOWNLOAD_SHA256[*]}"
}
function print_node_args() {
@ -107,7 +126,7 @@ function print_node_args() {
14.15) NODE_INSTALL_VERSION=14.15.4 ;;
14|14.16) NODE_INSTALL_VERSION=14.16.0 ;;
16|16.14) NODE_INSTALL_VERSION=16.14.2 ;;
*) echo "Unknown node version $1"; exit 1;
*) fail "Unknown node version $1" ;;
esac
printf -- "--build-arg NODE_INSTALL_VERSION=%s " "$NODE_INSTALL_VERSION"
}
@ -118,7 +137,7 @@ function print_yarn_args() {
1.16) YARN_INSTALL_VERSION=1.16.0 ;;
1.21) YARN_INSTALL_VERSION=1.21.1 ;;
1.22) YARN_INSTALL_VERSION=1.22.17 ;;
*) echo "Unknown yarn version $1"; exit 1;
*) fail "Unknown yarn version $1" ;;
esac
printf -- "--build-arg YARN_INSTALL_VERSION=%s " "$YARN_INSTALL_VERSION"
}
@ -140,11 +159,11 @@ function print_buildx_args() {
BUILDX_DOWNLOAD_SHA256[amd64]=c64de4f3c30f7a73ff9db637660c7aa0f00234368105b0a09fa8e24eebe910c3
BUILDX_DOWNLOAD_SHA256[arm64]=304d3d9822c75f98ad9cf57f0c234bcf326bbb96d791d551728cadd72a7a377f
;;
*) echo "Unknown buildx version $1"; exit 1;
*) fail "Unknown buildx version $1" ;;
esac
printf -- "--build-arg BUILDX_VERSION=%s " "$BUILDX_VERSION"
printf -- "--build-arg BUILDX_DOWNLOAD_SHA256=%s " "${BUILDX_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg BUILDX_DOWNLOAD_SHA256=%q " "${BUILDX_DOWNLOAD_SHA256[*]}"
}
function print_graphicsmagick_args() {
@ -165,7 +184,7 @@ function print_graphicsmagick_args() {
GRAPHISMAGICK_VERSION=1.3.36
GRAPHISMAGICK_DOWNLOAD_SHA256=1e6723c48c4abbb31197fadf8396b2d579d97e197123edc70a4f057f0533d563
;;
*) echo "Unknown graphicsmagick version $1"; exit 1;
*) fail "Unknown graphicsmagick version $1" ;;
esac
printf -- "--build-arg GRAPHISMAGICK_VERSION=%s " "$GRAPHISMAGICK_VERSION"
@ -178,7 +197,7 @@ function print_bazelisk_args() {
BAZELISK_VERSION=1.9.0
BAZELISK_DOWNLOAD_SHA256=b8c7f2a1b07ad64a2f27f8f19a202f90d044de7b5b6ccc387a6fe5d4a8ec4937
;;
*) echo "Unknown bazelisk version $1"; exit 1;
*) fail "Unknown bazelisk version $1" ;;
esac
printf -- "--build-arg BAZELISK_VERSION=%s " "$BAZELISK_VERSION"
@ -209,7 +228,7 @@ function print_ruby_args() {
RUBY_DOWNLOAD_SHA256="70b47c207af04bce9acea262308fb42893d3e244f39a4abc586920a1c723722b"
;;
*) echo "Unknown ruby version $1"; exit 1;
*) fail "Unknown ruby version $1" ;;
esac
printf -- "--build-arg RUBY_VERSION=%s " "$RUBY_VERSION"
@ -224,7 +243,7 @@ function print_bundler_args() {
2.3)
BUNDLER_VERSION=2.3.15
;;
*) echo "Unknown bundler version $1"; exit 1;
*) fail "Unknown bundler version $1" ;;
esac
printf -- "--build-arg BUNDLER_VERSION=%s " "$BUNDLER_VERSION"
@ -238,7 +257,7 @@ function print_rubygems_args() {
3.2)
RUBYGEMS_VERSION=3.2.33
;;
*) echo "Unknown rubygems version $1"; exit 1;
*) fail "Unknown rubygems version $1" ;;
esac
printf -- "--build-arg RUBYGEMS_VERSION=%s " "$RUBYGEMS_VERSION"
@ -249,7 +268,7 @@ function print_gcloud_args() {
383)
GCLOUD_VERSION=383.0.1
;;
*) echo "Unknown gcloud version $1"; exit 1;
*) fail "Unknown gcloud version $1" ;;
esac
printf -- "--build-arg GCLOUD_VERSION=%s " "$GCLOUD_VERSION"
@ -264,11 +283,11 @@ function print_kubectl_args() {
KUBECTL_DOWNLOAD_SHA256[amd64]=2d0f5ba6faa787878b642c151ccb2c3390ce4c1e6c8e2b59568b3869ba407c4f
KUBECTL_DOWNLOAD_SHA256[arm64]=1d77d6027fc8dfed772609ad9bd68f611b7e4ce73afa949f27084ad3a92b15fe
;;
*) echo "Unknown kubectl version $1"; exit 1;
*) fail "Unknown kubectl version $1" ;;
esac
printf -- "--build-arg KUBECTL_VERSION=%s " "$KUBECTL_VERSION"
printf -- "--build-arg KUBECTL_DOWNLOAD_SHA256=%s " "${KUBECTL_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg KUBECTL_DOWNLOAD_SHA256=%q " "${KUBECTL_DOWNLOAD_SHA256[*]}"
}
function print_helm_args() {
@ -280,11 +299,11 @@ function print_helm_args() {
HELM_DOWNLOAD_SHA256[amd64]=2170a1a644a9e0b863f00c17b761ce33d4323da64fc74562a3a6df2abbf6cd70
HELM_DOWNLOAD_SHA256[arm64]=e1348d94ce4caace43689ee2dfa5f8bcd8687c12053d9c13d79875b65d6b72aa
;;
*) echo "Unknown helm version $1"; exit 1;
*) fail "Unknown helm version $1" ;;
esac
printf -- "--build-arg HELM_VERSION=%s " "$HELM_VERSION"
printf -- "--build-arg HELM_DOWNLOAD_SHA256=%s " "${HELM_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg HELM_DOWNLOAD_SHA256=%q " "${HELM_DOWNLOAD_SHA256[*]}"
}
function parse_arguments() {
@ -307,7 +326,10 @@ function parse_arguments() {
if [ -n "${!tool}" ]; then
version="${!tool}"
case "$tool" in
OS) CUSTOM_BASE_IMAGE=$(get_base_image_reference $version) ;;
# explode debian:version into `print_image_args debian version`
OS) print_image_args ${version%:*} ${version##*:} ;;
DEBIAN) print_image_args debian $version ;;
UBI) print_image_args ubi $version ;;
RUBY) print_ruby_args $version ;;
BUNDLER) print_bundler_args $version ;;
RUBYGEMS) print_rubygems_args $version ;;
@ -325,30 +347,17 @@ function parse_arguments() {
GCLOUD) print_gcloud_args $version ;;
KUBECTL) print_kubectl_args $version ;;
HELM) print_helm_args $version ;;
*) echo "unknown tool $tool"; exit 1;;
*) fail "Unknown tool $tool" ;;
esac
fi
done
CUSTOM_BASE_IMAGE=${CUSTOM_BASE_IMAGE:-"debian:buster"}
BUILD_OS=${OS:-"debian:buster"}
printf -- "--build-arg CUSTOM_BASE_IMAGE=%s " "$CUSTOM_BASE_IMAGE"
printf -- "--build-arg BUILD_OS=%s " "$BUILD_OS"
printf -- "--platform=linux/%s " "${TARGETARCH}"
printf -- "--platform=%s " "${TARGETARCH}"
}
function generate_command() {
printf -- "docker buildx build "
parse_arguments
for i in "$@"
do
printf -- "%s " "$i"
done
printf -- "--push=${PUSH_CUSTOM_IMAGE:-false} "
printf -- ".\\n"
function run_command() {
printf "\t%s\n" "$@"
eval "$@"
}
function build_custom_if_needed() {
@ -357,11 +366,30 @@ function build_custom_if_needed() {
full_image_name="$build_image_path:$build_image_tag"
echo "Building image $full_image_name"
docker_command=$(generate_command $@ --cache-to=type=inline --cache-from="$full_image_name" -t "$full_image_name")
echo "Docker command:"
printf "\t%s\n" "$docker_command"
eval $docker_command
docker_build_command=$(parse_arguments)
docker_build_command="${docker_build_command} $@"
docker_build_command="${docker_build_command} --cache-from=\"$full_image_name\""
docker_build_command="${docker_build_command} --tag=\"$full_image_name\""
echo "Docker build command:"
# Prefer using `docker buildx` as it is more flexible,
# or use regular `docker build` if not available on older systems
if docker buildx version &> /dev/null; then
docker_build_command="${docker_build_command} --cache-to=type=inline"
docker_build_command="${docker_build_command} --push=${PUSH_CUSTOM_IMAGE:-false}"
run_command docker buildx build $docker_build_command .
else
docker_build_command="${docker_build_command} --build-arg TARGETARCH=${ARCH}"
run_command docker build $docker_build_command .
if [[ "$PUSH_CUSTOM_IMAGE" == "true" ]]; then
run_command docker push "$full_image_name"
fi
fi
printf "\n\nSUCCESS - Successfully built:\n\t%s\n" "$full_image_name"
}
# Use DEBIAN by default unless specified otherwise
DEBIAN=${DEBIAN:-bullseye}
build_custom_if_needed $@

View file

@ -1,7 +1,7 @@
# Note: Check out https://wiki.bash-hackers.org/syntax/pe for documentation on
# various variable operations used in this script.
PATH_TOOLS=(OS RUBY GOLANG NODE POSTGRESQL)
PATH_TOOLS=(DEBIAN OS UBI RUBY GOLANG NODE POSTGRESQL)
TAG_TOOLS=(BUNDLER RUBYGEMS GIT LFS CHROME YARN GRAPHICSMAGICK BAZELISK DOCKER BUILDX GCLOUD KUBECTL HELM)
# Generate the docker image path using the components that were specified via