-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMakefile
More file actions
137 lines (121 loc) · 4.85 KB
/
Makefile
File metadata and controls
137 lines (121 loc) · 4.85 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
.DEFAULT_GOAL := help
# default value if not provided
IMAGE ?= *
PRUNE ?= $(if $(filter *,$(IMAGE)),1,0)
.PHONY: help
help: ## Show this help message
@echo "Usage: make [target]"
@echo ""
@echo "Targets:"
@awk 'BEGIN {FS = ":.*##"; printf "\033[36m\033[0m"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
check_for_hadolint:
@echo "Checking if hadolint is available..."
@if ! command -v hadolint >/dev/null 2>&1; then \
echo >&2 "Error: hadolint is not installed or not in PATH. Install hadolint (https://github.com/hadolint/hadolint)"; \
exit 1; \
else \
echo "hadolint version $$(hadolint --version | grep -o '[0-9]*\.[0-9]*\.[0-9]*')"; \
fi;
check_for_docker:
@echo "Checking if docker is available..."
@if ! command -v docker >/dev/null 2>&1; then \
echo >&2 "Error: docker is not installed or not in PATH. Install Docker (https://docs.docker.com/get-docker/)"; \
exit 1; \
else \
echo "Docker version $$(docker --version | awk '{print $$3}' | sed 's/,//')"; \
fi;
check_image:
@if [ "$(IMAGE)" != "*" ] && [ ! -d "$(IMAGE)" ]; then \
echo >&2 "Error: Image directory '$(IMAGE)' not found"; \
exit 1; \
fi
##@ Linting
lint: check_for_hadolint check_image ## Run hadolint on all Dockerfiles or a specific image using IMAGE=name
@echo "Running hadolint on Dockerfiles..."
@for dockerfile in $(IMAGE)/Dockerfile*; do \
if [ -f "$$dockerfile" ]; then \
echo "Linting $$dockerfile"; \
hadolint "$$dockerfile" || true; \
fi; \
done
##@ Building
build_amd64: check_for_docker check_image ## Build Docker image(s) for AMD64 architecture. Use IMAGE=name
@echo "Building Docker images for linux/amd64..."
@set -e; for dir in $(IMAGE)/; do \
if [ -d "$$dir" ]; then \
image_name=$$(basename "$$dir"); \
if [ "$$image_name" = "template" ]; then \
echo "Skipping $$image_name (template only)"; \
continue; \
fi; \
for dockerfile in $$dir/Dockerfile*; do \
if [ -f "$$dockerfile" ]; then \
version=$$(echo "$$dockerfile" | sed 's/.*Dockerfile_//'); \
if [ "$$version" = "$$dockerfile" ]; then \
version="latest"; \
fi; \
echo "Building $$image_name:$$version (amd64) from $$dockerfile"; \
docker build \
--platform linux/amd64 \
--label built-by=makefile \
-t getwilds/$$image_name:$$version-amd64 \
-f "$$dockerfile" \
"$$dir"; \
if [ "$(PRUNE)" = "1" ]; then \
echo "Cleaning up Docker build cache and removing built image..."; \
docker system prune -f; \
docker rmi -f getwilds/$$image_name:$$version-amd64 2>/dev/null || true; \
fi; \
fi; \
done; \
fi; \
done
build_arm64: check_for_docker check_image ## Build Docker image(s) for ARM64 architecture. Use IMAGE=name
@echo "Building Docker images for linux/arm64..."
@set -e; for dir in $(IMAGE)/; do \
if [ -d "$$dir" ]; then \
image_name=$$(basename "$$dir"); \
if [ "$$image_name" = "template" ]; then \
echo "Skipping $$image_name (template only)"; \
continue; \
fi; \
if grep -q "^$$image_name$$" amd64_only_tools.txt 2>/dev/null; then \
echo "Skipping $$image_name (AMD64 only)"; \
continue; \
fi; \
for dockerfile in $$dir/Dockerfile*; do \
if [ -f "$$dockerfile" ]; then \
version=$$(echo "$$dockerfile" | sed 's/.*Dockerfile_//'); \
if [ "$$version" = "$$dockerfile" ]; then \
version="latest"; \
fi; \
echo "Building $$image_name:$$version (arm64) from $$dockerfile"; \
docker build \
--platform linux/arm64 \
--label built-by=makefile \
-t getwilds/$$image_name:$$version-arm64 \
-f "$$dockerfile" \
"$$dir"; \
if [ "$(PRUNE)" = "1" ]; then \
echo "Cleaning up Docker build cache and removing built image..."; \
docker system prune -f; \
docker rmi -f getwilds/$$image_name:$$version-arm64 2>/dev/null || true; \
fi; \
fi; \
done; \
fi; \
done
build: build_amd64 build_arm64 ## Build Docker image(s) for both AMD64 and ARM64 architectures. Use IMAGE=name for specific image, or leave blank for all
##@ Validation
validate: lint build ## Validate Dockerfiles: lint and build for both architectures. Use IMAGE=name for specific image, or leave blank for all
##@ Cleanup
clean: ## Remove all locally built getwilds images. Use IMAGE=name to clean specific image, or leave blank for all
@echo "Removing getwilds Docker images built by Makefile..."
@if [ "$(IMAGE)" = "*" ]; then \
echo "Removing all Makefile-built getwilds/* images..."; \
docker images --filter "label=built-by=makefile" "getwilds/*" -q | xargs docker rmi -f 2>/dev/null || true; \
else \
echo "Removing Makefile-built getwilds/$(IMAGE):* images..."; \
docker images --filter "label=built-by=makefile" "getwilds/$(IMAGE)" -q | xargs docker rmi -f 2>/dev/null || true; \
fi
@echo "Cleanup complete!"