91 lines
4.4 KiB
Docker
91 lines
4.4 KiB
Docker
# +======================================================================
|
||
# | 模块: 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_ 环境变量覆盖,不改镜像内文件)
|
||
# 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_DATABASE_DEFAULT_LINK="mysql:<用户>:<密码>@tcp(<主机>:<端口>)/<库名>?charset=utf8mb4&parseTime=true&loc=Local"
|
||
# -e GF_REDIS_DEFAULT_ADDRESS="<主机>:<端口>"
|
||
# -e GF_FILE_UPLOADDIR="/data/upload" # 容器内必须覆盖(配置默认为开发机路径)
|
||
CMD ["sh", "-c", "./${GOFILE}"]
|