84 lines
3.0 KiB
Bash
84 lines
3.0 KiB
Bash
#!/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"
|