小哥之哥 小哥之哥
首页
    • Prometheus
    • Kubertenes
    • Docker
    • MySQL
  • Go
  • Python
  • Vue
  • Jenkins
  • ELK
  • LDAP
  • 随笔
  • 最佳实践
  • 博客搭建
  • 问题杂谈
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

小哥之哥

运维扫地僧
首页
    • Prometheus
    • Kubertenes
    • Docker
    • MySQL
  • Go
  • Python
  • Vue
  • Jenkins
  • ELK
  • LDAP
  • 随笔
  • 最佳实践
  • 博客搭建
  • 问题杂谈
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 博客搭建

  • 随笔

    • https免费证书
    • k8s部署canal 1.1.6集群
    • Docker部署ElasticSearch 7.10
    • Linux系统流量监控-nethogs
    • Java应用Dockerfile编辑
    • Go应用Dockerfile编辑
      • 聊聊平滑迁移这件事
      • kafka二进制模式集群部署
      • Centos7搭建minio
    • 更多
    • 随笔
    tchua
    2023-06-30
    目录

    Go应用Dockerfile编辑

    # 一、概述


    我们知道使用GO开发的应用程序,我们可以打包成二进制文件,然后直接像shell脚本一样执行即可。因此基于此方式,我们在编辑go项目的Dockerfile时,可以借助多层构建的功能,使最终的镜像体积很小,但是也不影响业务的运行。

    # 二、GO应用打包介绍


    # 2.1 直接打包

    在项目根目录执行,这将在当前目录下生成一个名为应用程序module的可执行文件。

    go build
    
    1
    # 2.2 指定输出文件名

    我们如果想要指定打包后的脚本名称,则可以使用-o参数指定,指定打包后的项目脚本问app

    go build -o app
    
    1
    # 2.3 交叉编译

    Go交叉编译允许你在一个平台上构建适用于其他操作系统和架构的Go可执行文件。这对于在本地构建不同操作系统或架构的二进制文件非常有用。

    • 在 Windows 上构建 Linux 二进制文件
    # 设置变量
    SET CGO_ENABLED=0
    SET GOOS=linux
    SET GOARCH=amd64
    # 打包
    go build -o app.exe
    
    1
    2
    3
    4
    5
    6
    • 在Linux上构建Windows可执行文件
    # 设置变量
    GOOS=windows 
    GOARCH=amd64 
    # 打包
    go build -o app.exe
    
    1
    2
    3
    4
    5
    • 在MacOS上构建Windows可执行文件
    # 设置变量
    GOOS=windows 
    GOARCH=amd64 
    # 打包
    go build -o app.exe
    
    1
    2
    3
    4
    5

    # 三、Docker镜像


    使用Dockerfile将Go项目打包为Docker镜像。可以使用多层构建的方式,将Go应用程序编译并放入最终的镜像中。

    • Dockerfile示例
    FROM golang:1.20 as builder
    
    WORKDIR /apps
    
    COPY ./ /apps
    RUN export GOPROXY=https://goproxy.cn \
        && go build  -ldflags "-s -w" -o get-pod \
        && chmod +x get-pod
    
    FROM alpine
    LABEL maintainer="tchua"
    COPY --from=builder /apps/get-pod  /apps/
    
    RUN echo -e  "http://mirrors.aliyun.com/alpine/v3.15/main\nhttp://mirrors.aliyun.com/alpine/v3.15/community" >  /etc/apk/repositories \
    && apk  update && apk --no-cache add tzdata gcompat libc6-compat \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Shanghai/Asia" > /etc/timezone \
    && apk del tzdata \
    && ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2
    
    WORKDIR /apps
    
    
    CMD ["./get-pod"]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    说明

    上面Dockerfile我们使用了多层构建的方式:

    • FROM golang:1.20 as builder 阶段一,注意负责应用的依赖下载及打包
      • export GOPROXY=https://goproxy.cn 设置代理,加上GO依赖下载
      • go build -ldflags "-s -w" 指定链接标志以减小打包后可执行文件的大小
    • FROM alpine 阶段二,核心配置
      • COPY --from=builde 从阶段1中复制构建好的应用程序到当前阶段
      • libc6-compat 包 提供了对glibc的兼容支持,可以使用glibc编译的应用程序能够在这些系统上正常运行

    Alpine是一个基于musl libc和BusyBox的轻量级Linux发行版相比于传统的GNU C库(glibc),musl libc是另一个C库的实现,它旨在提供更小巧、更快速的运行时环境。

    • 查看构建后镜像大小

    可以看到镜像只有不到50M,如果使用原始GO镜像,则会达到上G的大小

    image-20230630172037586

    编辑 (opens new window)
    #Docker
    上次更新: 2023/06/30, 17:27:04
    Java应用Dockerfile编辑
    聊聊平滑迁移这件事

    ← Java应用Dockerfile编辑 聊聊平滑迁移这件事→

    最近更新
    01
    cert-manager自动签发Lets Encrypt
    09-05
    02
    Docker构建多架构镜像
    08-02
    03
    Prometheus数据迁移至VMstorage
    08-01
    更多文章>
    Theme by Vdoing | Copyright © 2023-2024 |豫ICP备2021026650号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式