Files
EasyGoAdmin_GoFrame_EleVue/.jenkins/Dockerfile
T
2026-10-20 14:55:25 +08:00

91 lines
4.4 KiB
Docker
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.
# +======================================================================
# | 模块: Jenkins 镜像构建文件
# | 说明: CI 场景将已编译的 Go 二进制打包为应用镜像(编译在 Jenkins 侧完成,镜像内不编译)
# | 适用: 各产品线共用;约定 二进制名 = 产品名 = 镜像名,由流水线统一注入
# | 构建示例(在项目根执行,产品名因产品线而异):
# | CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o <产品名> main.go
# | docker build -f .jenkins/Dockerfile \
# | --build-arg VAR_BASE_IMAGE=<基础镜像> \
# | --build-arg VAR_GOFILE=<产品名> \
# | --build-arg VAR_GOFILE_PATH=. \
# | --build-arg VAR_PORT=<端口> \
# | -t <仓库>/<产品名>:<TAG> .
# | 注意:
# | - 构建参数一律无默认值,必须由流水线显式传入(传什么就是什么,漏传/传错在构建期报错)
# | - VAR_GOFILE 为二进制文件名;VAR_GOFILE_PATH 为二进制所在目录(项目根传 .,可传 bin 等)
# | - 实际取用路径 = VAR_GOFILE_PATH/VAR_GOFILE(如 ./产品名 或 bin/产品名)
# | - 编译产物必须是 linux/amd64 格式(Windows 编译需加 GOOS=linux GOARCH=amd64)
# +======================================================================
# 基础镜像地址(如 alpine:3.22,可指向公司私服预置镜像)
ARG VAR_BASE_IMAGE
# 基础镜像
FROM ${VAR_BASE_IMAGE}
# 镜像作者
LABEL MAINTAINER="easygoadmin@163.com"
# 端口参数(后端监听端口,与 manifest/config/config.yaml 的 server.address 一致)
# 无默认值:未传时 ARG 静默置空,由下方校验层拦截报错
ARG VAR_PORT
# 二进制文件名参数(= 产品名)
ARG VAR_GOFILE
# 二进制所在目录参数(相对构建上下文;项目根传 .,可传 bin 等自定义目录)
ARG VAR_GOFILE_PATH
# 设置端口
ENV PORT=${VAR_PORT}
# 设置二进制文件名
ENV GOFILE=${VAR_GOFILE}
# 设置时区(日志落盘与 gcron 定时任务依赖系统时区)
ENV TZ=Asia/Shanghai
# 构建参数校验(紧随 ENV,先于 EXPOSE/COPY)
# ARG 未传时静默置空;若不拦截,EXPOSE 空参、COPY 空路径都会先报
# "EXPOSE requires at least one argument" / "source path cannot be absolute"
# 这类与参数毫无关联的晦涩错误——在此统一转为明确的参数缺失报错
RUN set -eux; \
if [ -z "${PORT}" ] || [ -z "${GOFILE}" ]; then \
echo "ERROR: 构建参数缺失。必须显式传入:VAR_PORT(监听端口)、VAR_GOFILE(二进制文件名)、VAR_GOFILE_PATH(所在目录,项目根传 .)"; \
exit 1; \
fi
# 暴露端口
EXPOSE ${PORT}
# 创建工作区
RUN mkdir -p /opt/apps
# 设置工作区
WORKDIR /opt/apps
# 拷贝运行时资产(四件缺一不可,路径相对项目根)
# manifest/config 运行时配置(敏感项运行时经 GF_GENV_ 环境变量覆盖,不改镜像内文件)
# manifest/data ip2region.xdb 归属地库
# resource 验证码字体、swagger 页面等静态资源
# templates 代码生成器模板(tool 域运行时读取)
COPY manifest ./manifest
COPY resource ./resource
COPY templates ./templates
# 拷贝 Jenkins 编译产物(路径 = VAR_GOFILE_PATH/VAR_GOFILE,如 ./产品名 或 bin/产品名)
# 编译建议:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags "-s -w" -o <产品名> main.go
COPY ${VAR_GOFILE_PATH}/${VAR_GOFILE} ./
# 构建期校验 + 补执行权限
# 参数传错/产物缺失在此立即失败并给出指引,不留到启动期以循环报错暴露
# chmod 防编译产物经跨系统拷贝丢失执行位(COPY 保留源文件权限)
RUN set -eux; \
if [ -z "${GOFILE}" ] || [ ! -f "./${GOFILE}" ]; then \
echo "ERROR: 二进制 ./${GOFILE} 不存在。请检查构建参数:VAR_GOFILE(文件名)与 VAR_GOFILE_PATH(所在目录,根目录传 .)、编译产物是否落在构建上下文内"; \
exit 1; \
fi; \
chmod +x "./${GOFILE}"
# 启动命令
# ${GOFILE} 为编译产物文件名(= 产品名)
# 配置覆盖示例(部署阶段注入,勿写死镜像):
# -e GF_GENV_DATABASE_DEFAULT_LINK="mysql:<用户>:<密码>@tcp(<主机>:<端口>)/<库名>?charset=utf8mb4&parseTime=true&loc=Local"
# -e GF_GENV_REDIS_DEFAULT_ADDRESS="<主机>:<端口>"
# -e GF_GENV_FILE_UPLOADDIR="/data/upload" # 容器内必须覆盖(配置默认为开发机路径)
CMD ["sh", "-c", "./${GOFILE}"]