徐州房地产信息网:go项目dockerfile最佳实践

admin 3个月前 (07-30) 科技 31 0
  • 1. 前言
  • 2. 不需要cgo情况下的最佳实践
  • 3. 依赖cgo情况下的最佳实践

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

,

Allbet Gmaing官网

欢迎进入Allbet Gmaing官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

dafa888体育声明:该文看法仅代表作者自己,与本平台无关。转载请注明:徐州房地产信息网:go项目dockerfile最佳实践

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:796
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1392
  • 评论总数:427
  • 浏览总数:32073