46 lines
1.4 KiB
Bash
Executable File
46 lines
1.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
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")")
|
|
|
|
entry_file=$(grep -rl "package main" "$service_dir"/*.go 2>/dev/null | head -n 1 || true)
|
|
[[ -z "$entry_file" ]] && continue
|
|
|
|
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}"
|
|
|
|
image_name="${IMAGE_PREFIX}/${service_name}-${service_type}:${IMAGE_TAG}"
|
|
echo "--- $image_name ---"
|
|
|
|
cat > Dockerfile.tmp <<EOF
|
|
FROM golang:1.25-alpine AS builder
|
|
RUN apk add --no-cache tzdata
|
|
WORKDIR /build
|
|
COPY go.mod go.sum ./
|
|
RUN go mod download
|
|
COPY . .
|
|
RUN go build -ldflags="-s -w" -o /app/main ./$service_dir
|
|
|
|
FROM alpine:latest
|
|
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
|
|
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
|
|
ENV TZ=Asia/Shanghai
|
|
WORKDIR /app
|
|
COPY --from=builder /app/main /app/main
|
|
COPY $service_dir/etc /app/etc
|
|
CMD ["./main", "-f", "etc/$config_name"]
|
|
EOF
|
|
|
|
docker build -f Dockerfile.tmp -t "$image_name" . && echo "OK: $image_name" || echo "FAIL: $image_name"
|
|
rm -f Dockerfile.tmp
|
|
done
|