zoukankan      html  css  js  c++  java
  • go项目dockerfile最佳实践

    1. 前言

    这几天在构建golang编写的web项目中,关于dockerfile编写的一些总结

    可能是单纯我比较菜(大雾

    由于go应用在go build之后会生成一个二进制文件,且Go宣称自己只需要Linux内核

    大多数编程语言都依赖于解释器,VM和/或系统库

    刚开始我按照常理思考,写出了如下的dockerfile, 但是最终docker build出来的镜像高达300多M, 这是由于golang这个基础镜像中的工具链及其依赖项(gitmercurial等)重达几百MB,而这一部分我们在运行的时候是不需要的

    FROM golang:1.14
    
    ENV GO111MODULE=on 
        GOPROXY=https://goproxy.cn,direct 
        GIN_MODE=release 
        PORT=80
        
    WORKDIR /app
    
    COPY . .
    
    RUN go build .
    
    EXPOSE 80
    
    ENTRYPOINT ["./toc-generator"]
    

    2. 不需要cgo情况下的最佳实践

    docker有一个基本镜像叫做scratch,它是一个空的镜像,在临时基础镜像上运行的应用程序只能访问内核

    至少在容器提供隔离的范围内

    所以此时我们的思路是

    1. golang基础镜像下build出二进制文件
    2. 然后使用scratch作为运行时的基础镜像
    3. 并且将上一个stage build出来的二进制文件它的相关依赖文件copy到scratch下

    所以我们现在的dockerfile大概如下

    # 打包依赖阶段使用golang作为基础镜像
    FROM golang:1.14 as builder
    
    # 启用go module
    ENV GO111MODULE=on 
        GOPROXY=https://goproxy.cn,direct
    
    WORKDIR /app
    
    COPY . .
    
    # CGO_ENABLED禁用cgo 然后指定OS等,并go build
    RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build .
    
    # 由于我不止依赖二进制文件,还依赖views文件夹下的html文件还有assets文件夹下的一些静态文件
    # 所以我将这些文件放到了publish文件夹
    RUN mkdir publish && cp toc-generator publish && 
        cp -r views publish && cp -r assets publish
    
    # 运行阶段指定scratch作为基础镜像
    FROM scratch
    
    WORKDIR /app
    
    # 将上一个阶段publish文件夹下的所有文件复制进来
    COPY --from=builder /app/publish .
    
    # 为了防止代码中请求https链接报错,我们需要将证书纳入到scratch中
    COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/cert
    
    # 指定运行时环境变量
    ENV GIN_MODE=release 
        PORT=80
    
    EXPOSE 80
    
    ENTRYPOINT ["./toc-generator"]
    

    3. 依赖cgo情况下的最佳实践

    由于需要依赖cgo,所以我们使用scratch无法满足需求,我们需要另外一个运行时基础镜像alpine,看下dockerhub官方的介绍,它也仅仅只有5MB大小

    所以替换下基础镜像,我们的dockerfile变成了如下的样子:

    # 打包依赖阶段使用golang作为基础镜像
    FROM golang:1.14 as builder
    
    # 启用go module
    ENV GO111MODULE=on 
        GOPROXY=https://goproxy.cn,direct
    
    WORKDIR /app
    
    COPY . .
    
    # 指定OS等,并go build
    RUN GOOS=linux GOARCH=amd64 go build .
    
    # 由于我不止依赖二进制文件,还依赖views文件夹下的html文件还有assets文件夹下的一些静态文件
    # 所以我将这些文件放到了publish文件夹
    RUN mkdir publish && cp toc-generator publish && 
        cp -r views publish && cp -r assets publish
    
    # 运行阶段指定scratch作为基础镜像
    FROM alpine
    
    WORKDIR /app
    
    # 将上一个阶段publish文件夹下的所有文件复制进来
    COPY --from=builder /app/publish .
    
    # 指定运行时环境变量
    ENV GIN_MODE=release 
        PORT=80
    
    EXPOSE 80
    
    ENTRYPOINT ["./toc-generator"]
    

    参考链接

    https://baijiahao.baidu.com/s?id=1617163590078677512&wfr=spider&for=pc

  • 相关阅读:
    吴裕雄--天生自然 R语言开发学习:模块包的安装命令
    玩转大数据系列之一:数据采集与同步
    阿里云弹性容器实例产品 ECI ——云原生时代的基础设施
    阿里云宣布进入 Serverless 容器时代,推出弹性容器实例服务 ECI
    阿里云宣布 Serverless 容器服务 弹性容器实例 ECI 正式商业化
    云HBase备份恢复,为云HBase数据安全保驾护航
    阿里云图数据库GraphDB上线,助力图数据处理
    免费带你体验阿里巴巴旗舰大数据计算产品MaxCompute
    如何快速打造一款高清又极速的短视频APP?
    视频云肖长杰:视频AI科技助力短视频生态
  • 原文地址:https://www.cnblogs.com/baoshu/p/13399780.html
Copyright © 2011-2022 走看看