-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbuild_image.sh
More file actions
executable file
·88 lines (73 loc) · 2.6 KB
/
build_image.sh
File metadata and controls
executable file
·88 lines (73 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
GREEN="\e[32m"
RED="\e[31m"
YELLOW="\e[33m"
NC="\e[0m"
trap 'echo -e "${RED}Error on line ${LINENO}. Aborting.${NC}" >&2; exit 1' ERR
usage() {
cat <<EOF >&2
Usage: $0 --account-id ID --region REGION --repo-name NAME [--tag TAG]
--account-id AWS account ID (required)
--region AWS region (required)
--repo-name ECR repository name (required)
--tag Image tag override; if omitted, use latest Git tag on HEAD
EOF
exit 1
}
ACCOUNT_ID=""
REGION=""
REPO_NAME=""
TAG=""
WITH_SLIM=false
while [[ $# -gt 0 ]]; do
case "$1" in
--account-id) ACCOUNT_ID="$2"; shift 2 ;;
--region) REGION="$2"; shift 2 ;;
--repo-name) REPO_NAME="$2"; shift 2 ;;
--tag) TAG="$2"; shift 2 ;;
--slim-image) WITH_SLIM=true; shift ;;
-h|--help) usage ;;
*) echo -e "${RED}Unknown option: $1${NC}" >&2; usage ;;
esac
done
[[ -n "$ACCOUNT_ID" && -n "$REGION" && -n "$REPO_NAME" ]] || usage
if [[ -n "$TAG" ]]; then
IMAGE_TAG="$TAG"
echo -e "${YELLOW}Using override tag: ${IMAGE_TAG}${NC}" >&2
else
IMAGE_TAG=$(git tag --points-at HEAD --sort=-version:refname | head -n1 || true)
if [[ -z "$IMAGE_TAG" ]]; then
echo -e "${YELLOW}No tag found on HEAD; falling back to commit hash${NC}" >&2
IMAGE_TAG=$(git rev-parse --short HEAD)
else
echo -e "${GREEN}Found Git tag on HEAD: ${IMAGE_TAG}${NC}" >&2
fi
fi
IMAGE_REPO="${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/${REPO_NAME}"
IMAGE_URI="${IMAGE_REPO}:${IMAGE_TAG}"
echo -e "${YELLOW}Building Docker image as ${IMAGE_REPO}:${IMAGE_TAG}…${NC}" >&2
docker buildx build \
--platform linux/amd64 \
--provenance=false \
-t "${IMAGE_REPO}" \
. >&2
echo -e "${GREEN}Build succeeded.${NC}" >&2
echo -e "${YELLOW}Tagging image…${NC}" >&2
docker tag "${IMAGE_REPO}" "${IMAGE_URI}" >&2
docker tag "${IMAGE_REPO}" "${IMAGE_REPO}:latest" >&2
echo -e "${GREEN}Tagging succeeded.${NC}" >&2
echo -e "${YELLOW}Pushing ${IMAGE_URI}…${NC}" >&2
docker push --quiet "${IMAGE_URI}" >&2
if $WITH_SLIM; then
echo -e "${YELLOW}Creating slim image…${NC}" >&2
slim --quiet build --http-probe=false --continue-after=1 --target "${IMAGE_REPO}:latest" --tag "${IMAGE_REPO}:slim-${IMAGE_TAG}"
docker push --quiet "${IMAGE_REPO}:slim-${IMAGE_TAG}" >&2
echo -e "${GREEN}Pushed ${IMAGE_REPO}:slim.${NC}" >&2
fi
echo -e "${GREEN}Pushed ${IMAGE_URI}.${NC}" >&2
echo -e "${YELLOW}Pushing latest tag…${NC}" >&2
docker push --quiet "${IMAGE_REPO}:latest" >&2
echo -e "${GREEN}Pushed latest tag.${NC}" >&2
jq -n --arg uri "$IMAGE_URI" '{"image_uri":$uri}'