go项目dockerfile最佳实践
1. 前言
这几天在构建golang编写的web项目中,关于dockerfile编写的一些总结
可能是单纯我比较菜(大雾
由于go应用在go build之后会生成一个二进制文件,且Go宣称自己只需要Linux内核
大多数编程语言都依赖于解释器,VM和/或系统库
刚开始我按照常理思考,写出了如下的dockerfile, 但是最终docker build出来的镜像高达300多M, 这是由于golang这个基础镜像中的工具链及其依赖项(git,mercurial等)重达几百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,它是一个空的镜像,在临时基础镜像上运行的应用程序只能访问内核
至少在容器提供隔离的范围内

所以此时我们的思路是
- 在
golang基础镜像下build出二进制文件 - 然后使用
scratch作为运行时的基础镜像 - 并且将上一个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
go项目dockerfile最佳实践的更多相关文章
- 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信
官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...
- dockerfile 最佳实践及示例
Dockerfile 最佳实践已经出现在官方文档中,地址在 Best practices for writing Dockerfiles.如果再写一份最佳实践,倒有点关公门前耍大刀之意.因此本篇文章是 ...
- 《容器高手实战: Dockerfile最佳实践》
Dockerfile最佳实践一个容器对应一个进程一个Docker容器应该只对应一个进程,也就是一个Docker 镜像一般只包含一个应用的制品包(比如.jar). 在需要组合多个进程的场景,使用容器组( ...
- Dockerfile 最佳实践
之前 一篇文章介绍 docker 的镜像基本原理和概念 ,主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法. 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以 ...
- SpringBoot系列: Spring项目异常处理最佳实践
===================================自定义异常类===================================稍具规模的项目, 一般都要自定义一组异常类, 这 ...
- 编写 Dockerfile 最佳实践
官方仓库虽然有数十万计的免费镜像,但大多数无法直接满足公司业务需求,这就需要我们自己去定制镜像了. Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文 ...
- Dockerfile最佳实践(一)
1.使用缓存 Dockerfile的每条指令都会将结果提交为新的镜像,下一跳指令将会基于上一步指令的镜像的基础上构建,如果一个镜像存在相同的父镜像和指令(除了ADD),Docker将会使用镜像而不是 ...
- React项目的最佳实践
项目代码 从零开始简书项目 从我第一次接触vue这个框架已经过了快一年的时间,陪伴我从前端小白到前端工程师,前端时间也是使用了 ts+vue这样的组合写代码,明显感觉vue与ts似乎没有产生比较好 ...
- vue项目缓存最佳实践
需求 在开发vue的项目中有遇到了这样一个需求:一个视频列表页面,展示视频名称和是否收藏,点击进去某一项观看,可以收藏或者取消收藏,返回的时候需要记住列表页面的页码等状态,同时这条视频的收藏状态也需要 ...
随机推荐
- 飞越面试官(一)--Java基础
大家好!我是本公众号唯一官方指定没头屑的小便--怕屁林. 众所周知,现场面试(包括视频面试)多数时候是没有白板,也就是说,对于你的知识点.项目经验.过往经历和个人介绍等等,都是靠一张嘴.所以考虑到这个 ...
- python基础知识练习1
1.要求:输入A.B.C获得方程的解. 分析:通过input函数接收A,B,C的值.通过公式计算出detal的值,再根据条件进行判断,输出所需要的值: def args_input(): try: A ...
- 初探pandas——安装和了解pandas数据结构
安装pandas 通过python pip安装pandas pip install pandas pandas数据结构 pandas常用数据结构包括:Series和DataFrame Series S ...
- 6.22 集训--DP复习一
总结 下午的突击练习完全不在状态 A.拦截导弹简单版 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 ...
- Mister B and PR Shifts,题解
题目链接 分析: 题意很明白,不再多说了,直接分析题目,首先想一想暴力,直接枚举起点,然后求出来,时间复杂度n*n,显然不太好,所以我们考虑换一种方法枚举,当然本质还是枚举,其实你会发现变化i次和i+ ...
- day47 数据库进阶
目录 一.select查询扩展 1 几个重要关键字的执行顺序 2 where筛选条件 3 group by分组 4 having 分组之后的筛选条件 5 distinct去重 6 order by 排 ...
- js复制内容到剪贴板格式化粘贴到excel中
<input id="Button1" type="button" value="导出EXCEL" onclick="cop ...
- python面试题二:Python 基础题
1.位和字节的关系? Byte 字节 bit 位 1Byte = 8bit 2.b.B.KB.MB.GB 的关系? 1Byte = 8bit KB 1KB=1024B MB 1MB=1024KB GB ...
- Django框架04 /模板相关、别名/反向解析/路由分发
Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...
- Python函数07/有参装饰器/多个装饰器装饰一个函数
Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...