diff --git a/deploy/dev/README.md b/deploy/dev/README.md index 9b8380c..f92d05c 100644 --- a/deploy/dev/README.md +++ b/deploy/dev/README.md @@ -2,8 +2,8 @@ ## 前置条件 -- Docker -- Go 1.25+(构建镜像时在容器内编译,本机不强制) +- Docker(需要 buildx) +- Python 3(构建脚本用于生成 bake 定义) ## 使用 @@ -23,7 +23,7 @@ docker compose ps docker compose down ``` -构建脚本会扫描 `app/` 下所有 `api`、`rpc`、`mq` 入口,生成 `juwan/-:dev` 镜像。编译失败的服务会跳过,不影响其他服务。 +构建脚本会扫描 `app/` 下所有 `api`、`rpc`、`mq` 入口,通过 `docker buildx bake` 并行构建所有服务镜像,生成 `juwan/-:dev`。 如需只启动部分服务: diff --git a/deploy/dev/build.sh b/deploy/dev/build.sh index 58d27e9..1035cbc 100755 --- a/deploy/dev/build.sh +++ b/deploy/dev/build.sh @@ -2,33 +2,31 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)" -IMAGE_PREFIX="juwan" +IMAGE_PREFIX="${IMAGE_PREFIX:-juwan}" IMAGE_TAG="${1:-dev}" cd "$ROOT_DIR" -find app -mindepth 2 -maxdepth 2 -type d \( -name "api" -o -name "rpc" -o -name "mq" \) | sort | while read -r service_dir; do - service_type=$(basename "$service_dir") - service_name=$(basename "$(dirname "$service_dir")") +bakefile=$(mktemp "${TMPDIR:-/tmp}/juwan-bake-XXXXXX") +mv "$bakefile" "${bakefile}.json" +bakefile="${bakefile}.json" - entry_file=$(grep -rl "package main" "$service_dir"/*.go 2>/dev/null | head -n 1 || true) - [[ -z "$entry_file" ]] && continue +python3 - "$IMAGE_PREFIX" "$IMAGE_TAG" "$bakefile" <<'PYEOF' +import json, os, subprocess, sys, glob - config_file=$(ls "$service_dir/etc/"*.yaml 2>/dev/null | head -n 1 || true) - config_name="${config_file:+$(basename "$config_file")}" - config_name="${config_name:-config.yaml}" +prefix, tag, outpath = sys.argv[1], sys.argv[2], sys.argv[3] - image_name="${IMAGE_PREFIX}/${service_name}-${service_type}:${IMAGE_TAG}" - echo "--- $image_name ---" - - cat > Dockerfile.tmp < {outpath}") +PYEOF + +docker buildx bake --load -f "$bakefile" +rm -f "$bakefile"