Files
admin-api/build.sh
T

84 lines
3.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
PROJECT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
REPOSITORY="$PROJECT_DIR/../chengdu-repository"
IMAGE='localhost/admin-api:1.2.1-pg-test'
JAR_FILE='target/admin-api-1.2.1-SNAPSHOT.jar'
usage() {
cat <<'EOF'
用法:./build.sh [-t 镜像名称:tag] [-r Maven缓存目录]
-t 默认 localhost/admin-api:1.2.1-pg-test,不读取 Maven 版本
-r 默认项目旁的 ../chengdu-repository;相对路径以项目目录为基准
-h 显示帮助
需要 JAVA_HOME 指向 JDK 8、Maven(或完整的 Maven Wrapper)和 Podman。
脚本编译 JAR、检查 PostgreSQL 驱动,然后构建镜像;不会推送或启动服务。
EOF
}
die() { printf '错误:%s\n' "$*" >&2; exit 1; }
while getopts ':t:r:h' option; do
case "$option" in
t) IMAGE="$OPTARG" ;;
r) REPOSITORY="$OPTARG" ;;
h) usage; exit 0 ;;
:) die "选项 -$OPTARG 缺少参数" ;;
\?) die "未知选项 -$OPTARG" ;;
esac
done
shift $((OPTIND - 1))
[[ $# -eq 0 ]] || die '不支持额外的位置参数'
[[ -n "$IMAGE" && -n "$REPOSITORY" ]] || die '镜像名和缓存目录不能为空'
cd "$PROJECT_DIR"
[[ -n "${JAVA_HOME:-}" ]] || die '请先设置 JAVA_HOME,指向 JDK 8'
for tool in java javac jar; do
[[ -x "$JAVA_HOME/bin/$tool" ]] || die "JAVA_HOME 中缺少 bin/$tool"
done
JAVA_VERSION="$("$JAVA_HOME/bin/javac" -version 2>&1)"
[[ "$JAVA_VERSION" == 'javac 1.8.'* ]] || die "必须使用 JDK 8,当前为 $JAVA_VERSION"
export PATH="$JAVA_HOME/bin:$PATH"
command -v podman >/dev/null 2>&1 || die '找不到 podman'
if [[ -f mvnw && -f .mvn/wrapper/maven-wrapper.properties && -f .mvn/wrapper/maven-wrapper.jar ]]; then
MAVEN=(bash ./mvnw)
else
command -v mvn >/dev/null 2>&1 || die 'Maven Wrapper 不完整,请安装 Maven 3(支持 JDK 8'
MAVEN=(mvn)
fi
mkdir -p -- "$REPOSITORY"
REPOSITORY="$(cd -- "$REPOSITORY" && pwd)"
printf 'Maven 缓存:%s\n镜像:%s\n' "$REPOSITORY" "$IMAGE"
"${MAVEN[@]}" "-Dmaven.repo.local=$REPOSITORY" -DskipTests package
[[ -f "$JAR_FILE" ]] || die "未生成 $JAR_FILE;若修改项目版本,请同步更新脚本中的 JAR_FILE"
# 先完整读取列表,避免 pipefail 下 grep 提前退出造成误报。
JAR_CONTENTS="$("$JAVA_HOME/bin/jar" tf "$JAR_FILE")"
if ! grep -E '^BOOT-INF/lib/postgresql-[^/]+\.jar$' <<< "$JAR_CONTENTS"; then
die '应用 JAR 中缺少 PostgreSQL JDBC 驱动,停止镜像构建'
fi
# Dockerfile 内嵌,通过标准输入传给 Podman,无需单独维护文件。
podman build --pull=always \
-f - \
--build-arg "JAR_FILE=$JAR_FILE" \
-t "$IMAGE" \
. <<'DOCKERFILE'
FROM docker.io/library/eclipse-temurin:8-jre-jammy
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' > /etc/timezone
EXPOSE 8080
ARG JAR_FILE
COPY ${JAR_FILE} /usr/local/adminapi/myapp.jar
ENTRYPOINT ["java", "-jar", "/usr/local/adminapi/myapp.jar"]
DOCKERFILE
printf '构建完成:%s\n' "$IMAGE"