feat(makefile): add docker pull/rebuild and dual tags (TAG1/TAG2); drop TAG\n\n- build/rebuild now tag with TAG1/TAG2\n- add docker pull (both tags)\n- push handles both tags\n- docs updated (README, docs/*)\n- examples migrated to TAG1/TAG2
This commit is contained in:
109
makefile
109
makefile
@@ -10,10 +10,13 @@
|
||||
# ---- Предустановленные значения под вашу сборку ----
|
||||
REGISTRY ?= hub.cism-ms.ru/library
|
||||
IMAGE ?=
|
||||
TAG ?= latest
|
||||
CONTEXT ?= .
|
||||
DOCKERFILE ?= Dockerfile
|
||||
|
||||
# Теги образа (двойная маркировка)
|
||||
TAG1 ?= latest
|
||||
TAG2 ?= v.0.0.1
|
||||
|
||||
# ---- Режимы сборки ----
|
||||
USE_BUILDX ?= 0 # 1 -> использовать docker buildx
|
||||
PLATFORMS ?= linux/amd64 # например: linux/amd64,linux/arm64
|
||||
@@ -66,11 +69,23 @@ SPLIT_SIZE ?= # размер чанка, напр.: 2G (п
|
||||
|
||||
# ---- Полное имя образа ----
|
||||
ifneq ($(strip $(REGISTRY)),)
|
||||
FULL_IMAGE := $(REGISTRY)/$(IMAGE):$(TAG)
|
||||
FULL_IMAGE := $(REGISTRY)/$(IMAGE):$(TAG1)
|
||||
else
|
||||
FULL_IMAGE := $(IMAGE):$(TAG)
|
||||
FULL_IMAGE := $(IMAGE):$(TAG1)
|
||||
endif
|
||||
|
||||
# Полные имена образов для двойного тегирования
|
||||
ifneq ($(strip $(REGISTRY)),)
|
||||
FULL_IMAGE_1 := $(REGISTRY)/$(IMAGE):$(TAG1)
|
||||
FULL_IMAGE_2 := $(REGISTRY)/$(IMAGE):$(TAG2)
|
||||
else
|
||||
FULL_IMAGE_1 := $(IMAGE):$(TAG1)
|
||||
FULL_IMAGE_2 := $(IMAGE):$(TAG2)
|
||||
endif
|
||||
|
||||
# Флаги тегов для docker build (-t tag1 [-t tag2])
|
||||
TAGS_FLAGS := -t "$(FULL_IMAGE_1)" $(if $(strip $(TAG2)),-t "$(FULL_IMAGE_2)",)
|
||||
|
||||
# ---- Цвета ----
|
||||
COLOR_RESET := \033[0m
|
||||
COLOR_INFO := \033[1;34m
|
||||
@@ -114,16 +129,18 @@ help:
|
||||
@echo " make git [status|pull|commit|push|sync]"
|
||||
@echo ""
|
||||
@echo "Key vars (override via make VAR=value):"
|
||||
@echo " REGISTRY=$(REGISTRY) IMAGE=$(IMAGE) TAG=$(TAG) CONTEXT=$(CONTEXT) DOCKERFILE=$(DOCKERFILE)"
|
||||
@echo " REGISTRY=$(REGISTRY) IMAGE=$(IMAGE) TAG1=$(TAG1) TAG2=$(TAG2) CONTEXT=$(CONTEXT) DOCKERFILE=$(DOCKERFILE)"
|
||||
@echo " USE_BUILDX=$(USE_BUILDX) PLATFORMS=$(PLATFORMS) PUSH=$(PUSH) LOAD=$(LOAD) NO_CACHE=$(NO_CACHE) PULL=$(PULL) QUIET=$(QUIET)"
|
||||
@echo " BUILD_ARGS=$(BUILD_ARGS) ARG_FILE=$(ARG_FILE) RUN_CMD=$(RUN_CMD)"
|
||||
@echo " ARCHIVE=$(ARCHIVE) LOGIN=$(LOGIN) PUSH_OFFLINE=$(PUSH_OFFLINE) KEEP_SRC_TAG=$(KEEP_SRC_TAG)"
|
||||
@echo " IMAGES_DIR=$(IMAGES_DIR)"
|
||||
@echo ""
|
||||
@echo "Examples:"
|
||||
@echo " make docker build IMAGE=myapp TAG=1.0.0"
|
||||
@echo " make docker push REGISTRY=registry.local/library IMAGE=myapp TAG=1.0.0"
|
||||
@echo " make docker save IMAGE=myapp TAG=1.0.0 COMPRESS=1"
|
||||
@echo " make docker build IMAGE=myapp TAG1=latest TAG2=v0.0.1"
|
||||
@echo " make docker rebuild IMAGE=myapp TAG1=latest TAG2=v0.0.1"
|
||||
@echo " make docker push REGISTRY=registry.local/library IMAGE=myapp TAG1=latest TAG2=v0.0.1"
|
||||
@echo " make docker pull REGISTRY=registry.local/library IMAGE=myapp TAG1=latest TAG2=v0.0.1"
|
||||
@echo " make docker save IMAGE=myapp TAG1=latest COMPRESS=1"
|
||||
@echo " make docker load ARCHIVE=images/myapp_1.0.0.tar.gz LOGIN=1 PUSH_OFFLINE=1"
|
||||
@echo " make git commit # спросит сообщение"
|
||||
@echo " make git push # commit+push с запросом сообщения"
|
||||
@@ -146,26 +163,29 @@ $(OFFLINE_DIR):
|
||||
# Внутренние цели (не вызывать напрямую)
|
||||
.PHONY: __docker_build __docker_check __docker_push __docker_login __docker_retag __docker_save __docker_load __docker_load_raw __docker_inspect __docker_create_builder __docker_use_builder __docker_clean __docker_print_config
|
||||
|
||||
# Доп. внутренние цели
|
||||
.PHONY: __docker_pull __docker_rebuild
|
||||
|
||||
# --- Команды сборки ---
|
||||
define DOCKER_BUILD_CLASSIC
|
||||
docker build $(CACHE_FLAG) $(PULL_FLAG) $(QUIET_FLAG) \
|
||||
-f $(DOCKERFILE) -t "$(FULL_IMAGE)" \
|
||||
$(BUILD_ARGS) $(ARG_FILE_FLAGS) \
|
||||
"$(CONTEXT)"
|
||||
docker build $(CACHE_FLAG) $(PULL_FLAG) $(QUIET_FLAG) \
|
||||
-f $(DOCKERFILE) $(TAGS_FLAGS) \
|
||||
$(BUILD_ARGS) $(ARG_FILE_FLAGS) \
|
||||
"$(CONTEXT)"
|
||||
endef
|
||||
|
||||
define DOCKER_BUILD_BUILDX
|
||||
docker buildx build $(CACHE_FLAG) $(PULL_FLAG) $(QUIET_FLAG) \
|
||||
$(if $(filter 1,$(PUSH)),--push,) \
|
||||
$(if $(filter 1,$(LOAD)),--load,) \
|
||||
--platform $(PLATFORMS) \
|
||||
-f $(DOCKERFILE) -t "$(FULL_IMAGE)" \
|
||||
$(BUILD_ARGS) $(ARG_FILE_FLAGS) \
|
||||
"$(CONTEXT)"
|
||||
docker buildx build $(CACHE_FLAG) $(PULL_FLAG) $(QUIET_FLAG) \
|
||||
$(if $(filter 1,$(PUSH)),--push,) \
|
||||
$(if $(filter 1,$(LOAD)),--load,) \
|
||||
--platform $(PLATFORMS) \
|
||||
-f $(DOCKERFILE) $(TAGS_FLAGS) \
|
||||
$(BUILD_ARGS) $(ARG_FILE_FLAGS) \
|
||||
"$(CONTEXT)"
|
||||
endef
|
||||
|
||||
__docker_build: $(LOG_DIR)
|
||||
@echo "$(COLOR_INFO)[INFO] Build: $(FULL_IMAGE)$(COLOR_RESET)"
|
||||
@echo "$(COLOR_INFO)[INFO] Build: $(FULL_IMAGE_1)$(COLOR_RESET)"
|
||||
@echo "$(COLOR_INFO)[INFO] Log: $(LOG_FILE)$(COLOR_RESET)"
|
||||
@{ \
|
||||
echo "=== Build started: $$(date) ==="; \
|
||||
@@ -178,20 +198,40 @@ __docker_build: $(LOG_DIR)
|
||||
} | tee $(LOG_FILE)
|
||||
@echo "$(COLOR_OK)[OK] Build success$(COLOR_RESET)"
|
||||
|
||||
# Пересборка без кэша (использует двойные теги TAG1/TAG2)
|
||||
__docker_rebuild:
|
||||
@$(MAKE) __docker_build NO_CACHE=1
|
||||
|
||||
__docker_check:
|
||||
@echo "$(COLOR_INFO)[INFO] Check (RUN_CMD) for $(FULL_IMAGE): $(RUN_CMD)$(COLOR_RESET)"
|
||||
@docker run --rm --entrypoint /bin/sh "$(FULL_IMAGE)" -lc "$(RUN_CMD)"
|
||||
@echo "$(COLOR_INFO)[INFO] Check (RUN_CMD) for $(FULL_IMAGE_1): $(RUN_CMD)$(COLOR_RESET)"
|
||||
@docker run --rm --entrypoint /bin/sh "$(FULL_IMAGE_1)" -lc "$(RUN_CMD)"
|
||||
|
||||
__docker_push:
|
||||
@if [ "$(USE_BUILDX)" != "1" ]; then \
|
||||
echo "$(COLOR_INFO)[INFO] Pushing: $(FULL_IMAGE)$(COLOR_RESET)"; \
|
||||
docker push "$(FULL_IMAGE)"; \
|
||||
echo "$(COLOR_INFO)[INFO] Pushing: $(FULL_IMAGE_1)$(COLOR_RESET)"; \
|
||||
docker push "$(FULL_IMAGE_1)"; \
|
||||
if [ -n "$(TAG2)" ]; then \
|
||||
echo "$(COLOR_INFO)[INFO] Pushing: $(FULL_IMAGE_2)$(COLOR_RESET)"; \
|
||||
docker push "$(FULL_IMAGE_2)"; \
|
||||
fi; \
|
||||
else \
|
||||
echo "$(COLOR_WARN)[WARN] USE_BUILDX=1: push выполняется при buildx (PUSH=1).$(COLOR_RESET)"; \
|
||||
echo "$(COLOR_WARN)[WARN] Пересоберите с PUSH=1 или выполните docker push вручную.$(COLOR_RESET)"; \
|
||||
echo "$(COLOR_WARN)[WARN] USE_BUILDX=1: push выполняется при buildx (PUSH=1).$(COLOR_RESET)"; \
|
||||
echo "$(COLOR_WARN)[WARN] Пересоберите с PUSH=1 или выполните docker push вручную.$(COLOR_RESET)"; \
|
||||
fi
|
||||
@echo "$(COLOR_OK)[OK] Push done$(COLOR_RESET)"
|
||||
|
||||
# Загрузка/обновление образов (тянет оба тега при наличии TAG2)
|
||||
__docker_pull:
|
||||
@if [ -z "$(IMAGE)" ]; then \
|
||||
echo "$(COLOR_ERR)[ERR] Укажи IMAGE: make docker pull IMAGE=myapp [REGISTRY=... TAG1=... TAG2=...]$(COLOR_RESET)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "$(COLOR_INFO)[INFO] Pull: $(FULL_IMAGE_1)$(COLOR_RESET)"; docker pull "$(FULL_IMAGE_1)" || true
|
||||
@if [ -n "$(TAG2)" ]; then \
|
||||
echo "$(COLOR_INFO)[INFO] Pull: $(FULL_IMAGE_2)$(COLOR_RESET)"; docker pull "$(FULL_IMAGE_2)" || true; \
|
||||
fi
|
||||
@echo "$(COLOR_OK)[OK] Pull done$(COLOR_RESET)"
|
||||
|
||||
__docker_login:
|
||||
@if [ -z "$(REGISTRY)" ]; then \
|
||||
echo "$(COLOR_ERR)[ERR] REGISTRY не задан. Пример: make docker login REGISTRY=registry.local$(COLOR_RESET)"; \
|
||||
@@ -212,7 +252,7 @@ __docker_retag:
|
||||
__docker_save: | $(IMAGES_DIR) $(OFFLINE_DIR)
|
||||
@src="$(SRC_IMAGE)"; \
|
||||
if [ -z "$$src" ]; then \
|
||||
if [ -n "$(IMAGE)" ]; then src="$(FULL_IMAGE)"; else echo "$(COLOR_ERR)[ERR] Укажи SRC_IMAGE или IMAGE/TAG$(COLOR_RESET)"; exit 1; fi; \
|
||||
if [ -n "$(IMAGE)" ]; then src="$(FULL_IMAGE)"; else echo "$(COLOR_ERR)[ERR] Укажи SRC_IMAGE или IMAGE:TAG1$(COLOR_RESET)"; exit 1; fi; \
|
||||
fi; \
|
||||
docker image inspect "$$src" >/dev/null 2>&1 || { echo "$(COLOR_ERR)[ERR] Образ не найден: $$src$(COLOR_RESET)"; exit 1; }; \
|
||||
safe="$${src//\//_}"; safe="$${safe//:/_}"; out="$(IMAGES_DIR)/$$safe.tar"; \
|
||||
@@ -248,14 +288,14 @@ __docker_load: | $(OFFLINE_DIR)
|
||||
@awk '/Loaded image:/ { last=$$0 } END { gsub(/^.*Loaded image: /,"",last); print last }' "$(LOAD_LOG)" > "$(SRC_FILE)"
|
||||
@src="$$(cat "$(SRC_FILE)" 2>/dev/null || true)"; \
|
||||
if [ -z "$$src" ]; then \
|
||||
echo "$(COLOR_ERR)[ERR] Не удалось определить repo:tag из docker load. Укажи IMAGE/TAG вручную.$(COLOR_RESET)"; \
|
||||
echo "$(COLOR_ERR)[ERR] Не удалось определить repo:tag из docker load. Укажи IMAGE:TAG вручную.$(COLOR_RESET)"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "$(COLOR_OK)[OK] Загружен исходный образ: $$src$(COLOR_RESET)"; \
|
||||
repo="$${src%:*}"; srctag="$${src#*:}"; [ "$$repo" = "$$srctag" ] && srctag="latest"; \
|
||||
src_name="$${repo##*/}"; \
|
||||
dst_image="$(IMAGE)"; [ -z "$$dst_image" ] && dst_image="$$src_name"; \
|
||||
if [ -z "$(IMAGE)" ] && [ "$(KEEP_SRC_TAG)" = "1" ]; then dst_tag="$$srctag"; else dst_tag="$(TAG)"; fi; \
|
||||
if [ -z "$(IMAGE)" ] && [ "$(KEEP_SRC_TAG)" = "1" ]; then dst_tag="$$srctag"; else dst_tag="$(TAG1)"; fi; \
|
||||
if [ -z "$(REGISTRY)" ]; then echo "$(COLOR_ERR)[ERR] REGISTRY пуст$(COLOR_RESET)"; exit 1; fi; \
|
||||
full_dst="$(REGISTRY)/$$dst_image:$$dst_tag"; echo "$$full_dst" > "$(DST_FILE)"; \
|
||||
echo "$(COLOR_INFO)[INFO] Тегируем: $$src -> $$full_dst$(COLOR_RESET)"; \
|
||||
@@ -264,7 +304,7 @@ __docker_load: | $(OFFLINE_DIR)
|
||||
if [ "$(PUSH_OFFLINE)" = "1" ]; then echo "$(COLOR_INFO)[INFO] docker push $$full_dst$(COLOR_RESET)"; docker push "$$full_dst"; echo "$(COLOR_OK)[OK] Пуш завершён$(COLOR_RESET)"; else echo "$(COLOR_WARN)[WARN] PUSH_OFFLINE=0: пуш пропущен$(COLOR_RESET)"; fi
|
||||
|
||||
__docker_inspect:
|
||||
@docker image inspect "$(FULL_IMAGE)" || true
|
||||
@docker image inspect "$(FULL_IMAGE_1)" || true
|
||||
|
||||
__docker_create_builder:
|
||||
@docker buildx create --name $(BUILDER) --use --bootstrap || docker buildx use $(BUILDER)
|
||||
@@ -284,7 +324,8 @@ __docker_print_config:
|
||||
@echo "FULL_IMAGE : $(FULL_IMAGE)"
|
||||
@echo "REGISTRY : $(REGISTRY)"
|
||||
@echo "IMAGE : $(IMAGE)"
|
||||
@echo "TAG : $(TAG)"
|
||||
@echo "TAG1 : $(TAG1)"
|
||||
@echo "TAG2 : $(TAG2)"
|
||||
@echo "CONTEXT : $(CONTEXT)"
|
||||
@echo "DOCKERFILE : $(DOCKERFILE)"
|
||||
@echo "USE_BUILDX : $(USE_BUILDX)"
|
||||
@@ -309,8 +350,10 @@ docker:
|
||||
@sub="$(word 2,$(MAKECMDGOALS))"; \
|
||||
case "$$sub" in \
|
||||
build) $(MAKE) __docker_build ;; \
|
||||
rebuild) $(MAKE) __docker_rebuild ;; \
|
||||
check) $(MAKE) __docker_check ;; \
|
||||
push) $(MAKE) __docker_build __docker_check __docker_push ;; \
|
||||
pull) $(MAKE) __docker_pull ;; \
|
||||
save) $(MAKE) __docker_save ;; \
|
||||
load) $(MAKE) __docker_load ;; \
|
||||
load-raw) $(MAKE) __docker_load_raw ;; \
|
||||
@@ -323,9 +366,11 @@ docker:
|
||||
print-config) $(MAKE) __docker_print_config ;; \
|
||||
"") \
|
||||
echo "$(COLOR_INFO)[INFO] Docker commands:$(COLOR_RESET)"; \
|
||||
echo " make docker build — собрать образ"; \
|
||||
echo " make docker build — собрать образ (два тега TAG1/TAG2)"; \
|
||||
echo " make docker rebuild — пересобрать без кэша (TAG1/TAG2)"; \
|
||||
echo " make docker check — проверить контейнер (RUN_CMD)"; \
|
||||
echo " make docker push — build + check + push"; \
|
||||
echo " make docker push — build + check + push (TAG1/TAG2)"; \
|
||||
echo " make docker pull — скачать/обновить образы по TAG1/TAG2"; \
|
||||
echo " make docker save — сохранить образ в ./images/"; \
|
||||
echo " make docker load — загрузить из архива и (опц.) запушить"; \
|
||||
echo " make docker load-raw — чистый docker load -i FILE"; \
|
||||
|
||||
Reference in New Issue
Block a user