go-admin 构建arm镜像
目录
1、 go-admin Dockerfile
2、docker build go-admin
3、settings.yml
4、go-admin-ui Dockerfile
5、docker build go-admin-ui
6、go-admin.yaml
7、go-admin-ui.yaml
1、 go-admin Dockerfile
# 构建阶段:使用 Go 1.24 版本(支持远程调试)
FROM golang:1.24-alpine AS builder# 配置环境变量(ENV 内部不允许插入注释行,注释需放在 ENV 外部)
# 启用调试符号(保留调试信息):CGO_CFLAGS="-g -O0"、GOFLAGS="-gcflags=all=-N -l"
ENV GOPROXY=https://goproxy.cn/,direct \
GO111MODULE=on \
CGO_ENABLED=1 \
GOOS=linux \
GOARCH=arm64 \
CGO_CFLAGS="-g -O0" \
GOFLAGS="-gcflags=all=-N -l"# 安装编译工具和调试依赖
RUN apk add --no-cache git make gcc g++ musl-dev# 克隆代码并编译(保留调试符号)
RUN git clone https://github.com/go-admin-team/go-admin.git /app && \
cd /app && \
go mod tidy && \
go build -gcflags="all=-N -l" -o go-admin# 运行阶段:使用轻量 Alpine 镜像
FROM alpine:latest# 配置时区
ENV TZ=Asia/Shanghai# 安装运行依赖和调试工具
RUN apk add --no-cache ca-certificates tzdata libc6-compat && \
apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community delve# 创建日志目录和配置目录
RUN mkdir -p /app/config /app/temp/logs && \
chmod -R 777 /app/temp/logs# 复制编译产物和配置文件
COPY --from=builder /app/go-admin /app/
COPY --from=builder /app/config/settings.yml /app/config/settings.yml
COPY settings.yml /app/config/settings.yml# 暴露应用端口和调试端口
EXPOSE 8000
EXPOSE 2345# 工作目录
WORKDIR /app# 启动命令(远程调试)
CMD ["/bin/sh", "-c", "dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./go-admin -- server -c config/settings.yml -a true"]
或者
# 构建阶段:使用 Go 1.24 版本(支持远程调试)
FROM golang:1.24-alpine AS builder# 配置环境变量
# 移除GOFLAGS中的-l flag
ENV GOPROXY=https://goproxy.cn/,direct \
GO111MODULE=on \
CGO_ENABLED=1 \
GOOS=linux \
GOARCH=arm64 \
CGO_CFLAGS="-g -O0" \
GOFLAGS="-gcflags=all=-N"# 安装编译工具和调试依赖
RUN apk add --no-cache git make gcc g++ musl-dev unzip# 创建应用目录
RUN mkdir -p /app /tmp/build# 复制所有可能的本地文件(使用通配符避免文件不存在时报错)
COPY go-admin.zip* /tmp/build/
COPY settings.yml* /tmp/build/# 处理源码:优先使用本地zip,否则git拉取
RUN if [ -f "/tmp/build/go-admin.zip" ]; then \
unzip /tmp/build/go-admin.zip -d /app && \
# 处理可能的压缩包内目录结构不一致问题(兼容ash shell)
# 注意压缩包内的目录可能是go-admin-master而不是go-admin
if [ -d "/app/go-admin" ] || [ -d "/app/go-admin-master" ]; then \
# 先判断实际目录名称
SRC_DIR="/app/go-admin" && \
if [ -d "/app/go-admin-master" ]; then \
SRC_DIR="/app/go-admin-master"; \
fi && \
# 移动所有文件(包括隐藏文件)
find $SRC_DIR -maxdepth 1 -exec mv {} /app \; && \
rm -rf $SRC_DIR; \
fi; \
else \
git clone https://github.com/go-admin-team/go-admin.git /app; \
fi && \
cd /app && \
go mod tidy && \
go build -gcflags="all=-N" -o go-admin# 运行阶段:使用轻量 Alpine 镜像
FROM alpine:latest# 配置时区
ENV TZ=Asia/Shanghai# 安装运行依赖和调试工具
RUN apk add --no-cache ca-certificates tzdata libc6-compat && \
apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community delve# 创建日志目录和配置目录
RUN mkdir -p /app/config /app/temp/logs && \
chmod -R 777 /app/temp/logs# 复制编译产物
COPY --from=builder /app/go-admin /app/# 复制源码中的默认配置
COPY --from=builder /app/config/settings.yml /app/config/settings.yml.default# 复制本地settings.yml(如果存在)
COPY --from=builder /tmp/build/settings.yml /app/config/# 如果本地配置不存在,则使用默认配置
RUN if [ ! -f "/app/config/settings.yml" ]; then \
cp /app/config/settings.yml.default /app/config/settings.yml; \
fi# 暴露应用端口和调试端口
EXPOSE 8000
EXPOSE 2345# 工作目录
WORKDIR /app# 启动命令(远程调试)
CMD ["/bin/sh", "-c", "dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./go-admin -- server -c config/settings.yml -a true"]
2、docker build go-admin
docker buildx build --load --platform linux/arm64 -t go-admin .
3、settings.yml
settings:
application:
mode: dev
host: 0.0.0.0
name: testApp
port: 8000
readtimeout: 1
writertimeout: 2
enabledp: true
logger:
# 关键修改:日志路径改为容器内绝对路径
path: /app/temp/logs # 原路径为 temp/logs,易导致路径解析错误
stdout: 'file'
level: trace
enableddb: true
jwt:
secret: go-admin
timeout: 3600
database:
driver: mysql
source: user:password@tcp(mysql:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
registers:
- sources:
- user:password@tcp(mysql:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
gen:
dbname: dbname
frontpath: ../go-admin-ui/src
extend:
demo:
name: data
cache:
redis:
addr: redis:6379
password:
db: 2
queue:
redis:
addr: redis1:6379
password:
producer:
streamMaxLength: 100
approximateMaxLength: true
consumer:
visibilityTimeout: 60
bufferSize: 100
concurrency: 10
blockingTimeout: 5
reclaimInterval: 1
locker:
redis:
4、go-admin-ui Dockerfile
# 构建阶段:使用Node镜像
FROM node:lts-alpine AS build-stage
LABEL stage=build-stage
LABEL maintainer="your-name <your-email>"# 设置工作目录
WORKDIR /app# 安装编译工具和Python(node-gyp需要)
RUN echo "安装编译工具和Python..." && \
apk update && \
apk add --no-cache --virtual .gyp python3 py3-pip make g++ && \
# 检查是否已经存在python链接,如果不存在则创建
if [ ! -f /usr/bin/python ]; then \
ln -s /usr/bin/python3 /usr/bin/python; \
echo "创建了python符号链接"; \
else \
echo "python符号链接已存在"; \
fi && \
# 验证安装
echo "Python版本: $(python3 --version)" && \
echo "Pip版本: $(pip --version)" && \
echo "G++版本: $(g++ --version | head -n 1)"# 先复制package文件并安装依赖,利用Docker缓存机制
COPY package.json package-lock.json* ./# 使用国内npm镜像加速依赖安装
RUN echo "安装npm依赖..." && \
npm config set registry https://registry.npmmirror.com && \
npm install --legacy-peer-deps && \
# 清理npm缓存,减小镜像体积
npm cache clean --force# 复制源代码
COPY . .# 构建生产版本 - 添加NODE_OPTIONS环境变量解决OpenSSL问题
RUN echo "构建生产版本..." && \
export NODE_OPTIONS=--openssl-legacy-provider && \
npm run build:prod# 生产阶段:使用Nginx镜像
FROM nginx:alpine AS production-stage
LABEL maintainer="your-name <your-email>"# 复制构建产物到Nginx
COPY --from=build-stage /app/dist /usr/share/nginx/html# 暴露80端口
EXPOSE 80# 启动Nginx
CMD ["nginx", "-g", "daemon off;"]
5、docker build go-admin-ui
docker buildx build --load --platform linux/arm64 -t go-admin-ui .
6、go-admin.yaml
apiVersion: v1
kind: Service
metadata:
name: go-admin
namespace: dev
labels:
service: go-admin
spec:
ports:
- name: http # 原有业务端口
port: 8000
targetPort: 8000
protocol: TCP
- name: debug # 新增调试端口
port: 2345
targetPort: 2345
protocol: TCP
type: NodePort # 保留NodePort类型,方便外部访问调试端口
selector:
app: go-admin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-admin
namespace: dev
labels:
app: go-admin
spec:
replicas: 1
selector:
matchLabels:
app: go-admin
template:
metadata:
labels:
app: go-admin
spec:
containers:
- name: go-admin
imagePullPolicy: IfNotPresent
image: go-admin:latest # 确保镜像已包含远程调试配置(如dlv工具)
ports:
- containerPort: 8000 # 原有业务端口
name: http
protocol: TCP
- containerPort: 2345 # 新增调试端口(容器内开放)
name: debug
protocol: TCP
# 启动命令:使用dlv监听2345端口(需镜像支持调试)
command: ["/bin/sh", "-c"]
args:
- >-
dlv --listen=:2345
--headless=true
--api-version=2
--accept-multiclient
exec ./go-admin --
server -c config/settings.yml -a true
volumeMounts:
- mountPath: /etc/localtime
name: volume-localtime
# 调试模式建议添加此配置,避免容器因调试暂停被K8s杀死
livenessProbe:
initialDelaySeconds: 300 # 延长健康检查初始延迟
periodSeconds: 10
tcpSocket:
port: 8000
readinessProbe:
initialDelaySeconds: 60
periodSeconds: 5
tcpSocket:
port: 8000
volumes:
- hostPath:
path: /etc/localtime
type: ''
name: volume-localtime
7、go-admin-ui.yaml
apiVersion: v1
kind: Service
metadata:
name: go-admin-ui
namespace: dev
labels:
service: go-admin-ui
spec:
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
app: go-admin-ui
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-admin-ui
namespace: dev
labels:
app: go-admin-ui
spec:
replicas: 1
selector:
matchLabels:
app: go-admin-ui
template:
metadata:
labels:
app: go-admin-ui
spec:
containers:
- name: go-admin-ui
imagePullPolicy: IfNotPresent
image: go-admin-ui:latest
ports:
- containerPort: 80
name: http
protocol: TCP
volumeMounts:
- mountPath: /etc/localtime
name: volume-localtime
volumes:
- hostPath:
path: /etc/localtime
type: ''
name: volume-localtime