当前位置: 首页 > 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"]

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.dtcms.com/a/299557.html

相关文章:

  • 基于遗传算法的多无人车协同侦察与安全保护策略优化
  • Java 封装、继承与多态:从基础到实践的核心思想
  • TypeScript 中的 typeof
  • 【17】C# 窗体应用WinForm ——【文本框TextBox、富文本框RichTextBox 】属性、方法、实例应用
  • SpringBoot总结
  • 秋招Day19 - 分布式 - 限流
  • VUE2 学习笔记7 v-model、过滤器
  • 各种前端框架界面
  • ARM SMMUv3控制器注册过程分析(八)
  • odoo代码分析(一)
  • 以太坊下一阶段的关键——隐私
  • 根本是什么
  • Transformer:颠覆NLP的自注意力革命
  • ts-node 深入全面讲解
  • nginx一个域名下部署多套前端项目
  • 松茸第一品牌菌贝品质把控对行业的影响分析
  • haproxy配置详解
  • mysql查找数据库表中某几个连续的编号中中断的编号
  • RustFS for .NET 演示项目深度解析:构建 S3 兼容的分布式存储应用
  • 二次函数图像动画展示
  • 雨雪雾冰全预警:交通气象站为出行安全筑起“隐形防护网”
  • 【愚公系列】《MIoT.VC》003-构建基本仿真工作站(组件的属性、行为、视频展示)
  • Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
  • inversify
  • 【web大前端】001_前端开发入门:创建你的第一个网页
  • 0基础法考随手笔记 03(刑诉05 刑事证据与证明+06 强制措施)
  • 【智能协同云图库】第三期:实现用户上传图片及审核功能、使用模板方法模式优化上传图片功能、使用 Jsoup 实现批量抓取和上传图片功能
  • 掌握Gemini-2.5:现代AI开发中实用应用的综合指南
  • 2025最新软件测试面试八股文【附文档】
  • 基于动态增强的 LLM 置信度方法研究