当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/600871.html

相关文章:

  • (LeetCode 面试经典 150 题) 20. 有效的括号 (栈)
  • Ubuntu 18.04安装Fast-Lio2教程
  • MySQL进阶学习与初阶复习第三天
  • Windows11下和Vmware中的Ubuntu22.04设置samba服务遇到的一个问题- valid users和guest设置冲突
  • 单元测试、系统测试、集成测试知识详解
  • 深入解析命名管道:原理、实现与进程间通信应用
  • 大型微服务项目:听书——12 数据一致性自定义starter封装缓存操作
  • 2025年全国青少年信息素养大赛Scratch算法创意实践挑战赛 小低组 初赛 真题
  • Fast_Lio 修改激光雷达话题
  • C++核心编程学习--对象特性--对象模型和this指针
  • 在C#中判断两个列表数据是否相同
  • 服务器:数字世界的隐形引擎
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(四)
  • 「iOS」————继承链与对象的结构
  • 数据结构 二叉树(3)---层序遍历二叉树
  • 系统性提升大模型回复准确率:从 RAG 到多层 Chunk 策略
  • 机器学习特征工程:特征选择及在医学影像领域的应用
  • 【AI】联网模式
  • odoo代码分析(二)
  • idea中无法删除模块,只能remove?
  • 建筑施工场景下漏检率↓76%!陌讯多模态融合算法在工程安全监控的落地实践
  • 三防平板搭载2D扫描头:工业数据采集的革新利器
  • python—————knn算法
  • 【图像分割】记录1:unet, yolov8_seg
  • 嵌入式分享#27:原来GT911有两个I2C地址(全志T527)
  • 深度学习损失函数的设计哲学:从交叉熵到Huber损失的深入探索
  • Spring AI Alibaba Video 示例
  • 阿里开源Qwen3-Coder,编程大模型进入高效时代
  • Go语言unsafe包深度解析
  • 机器学习入门:线性回归详解与实战