最简单的 Go Dockerfile 编写姿势,没有之一!

2020-12-10 14:46:40 +08:00
 kevinwan

1. Dockerfile 一些额外注意点

2. 多阶段构建

3. 完整 Dockerfile 编写过程

4. 总结

goctl 工具极大简化了 Dockerfile 文件的编写,提供了开箱即用的最佳实践,并且支持了模板自定义。

如果觉得工具有帮助,欢迎 star 🤝

5. 项目地址

https://github.com/tal-tech/go-zero

8210 次点击
所在节点    推广
64 条回复
yzbythesea
2020-12-10 14:48:19 +08:00
为什么不在本地编译好 binary 然后传进 docker 里呢?
Vegetable
2020-12-10 14:51:07 +08:00
@yzbythesea 可能应上 CI 环境呗,本地能做的只有 git push
feelinglucky
2020-12-10 14:54:44 +08:00
@yzbythesea 本地编译的二进制文件再打包到 Docker 镜像中不符合 CI 的规范,同时也不方便交叉编译等情况,所以正确规范的做法是 docker golang 镜像 build 通过后,将产出二进制文件 cp 到第二 stage 的 base 镜像。

不过楼主的 Dockerfile 我建议使用 make 等构建工具去构建( golang 镜像自带的),因为如果涉及到更改配置、参数什么的,就又要该 Dockerfile 文件了,会很麻烦而且容易出错。
lwch
2020-12-10 14:59:49 +08:00
alpine 镜像里的 glibc 是阉割过的版本,拿来跑 go 程序需要专门编译,而且线上实测过性能下降特别明显,只能拿来做个玩具
kevinwan
2020-12-10 15:14:33 +08:00
@lwch 有实测数据嘛?我们千万级日活都是用 `alpine` 的,没遇到问题
kevinwan
2020-12-10 15:15:11 +08:00
@feelinglucky 愿闻其详
xin053
2020-12-10 15:18:44 +08:00
Dockerfile 最佳实践中尽量减少层,比如将多个 RUN 合成一个,例如
RUN apk update --no-cache
RUN apk add --no-cache ca-certificates
RUN apk add --no-cache tzdata
可以写成
RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata
knight0zh
2020-12-10 15:25:18 +08:00
更新真快啊,上周问的功能这周就出了。
kevinwan
2020-12-10 15:32:26 +08:00
@xin053 对的,这个很快就改掉,👍🏻
12101111
2020-12-10 15:43:36 +08:00
@lwch alpine 用的是 musl, 根本没有 glibc
CGO_ENABLED=0 的情况下 go 编译器压根不需要 libc, 性能和什么 libc 没有任何关系, go 的标准库在 Linux 上是直接调 syscall 的
GopherDaily
2020-12-10 16:07:07 +08:00
哪来的🚴‍♀️
kevinwan
2020-12-10 16:21:26 +08:00
@xin053 已修改,代码已提交
kevinwan
2020-12-10 16:22:36 +08:00
下一篇文章写个一键生成 k8s 部署文件的
lyi4ng
2020-12-10 16:31:57 +08:00
alpine 啊,我记得他的 lfs 是通过 minilibc 和 busybox 构建的,那得要求服务相关代码和脚本高度规范的,就 busybox 这玩意的 shll 规范就能折磨死无数用 bash 写 shell 脚本的人
feelinglucky
2020-12-10 16:44:24 +08:00
@kevinwan 如果是一间部署 K8s 的脚本工具集的话,就不要重复造轮子了,兄弟见笑可以参考我原先写的

https://github.com/mingcheng/deploy-k8s-within-aliyun-mirror
kevinwan
2020-12-10 16:52:12 +08:00
@feelinglucky 学习下,不过我轮子已造好,只是写个文章介绍下哈
renzhe8102
2020-12-10 17:14:19 +08:00
yzbythesea
2020-12-10 17:42:31 +08:00
@feelinglucky 如果说 CI/CD,我也没见过。都是 builder 的机器在编译,当然你可以把 builder 容器化,但是 builder 的 docker image 是和生产环境不一样的。
beginor
2020-12-10 21:22:08 +08:00
把所有的语句都写到一个 install.sh 里面,Dockerfile 一个指令 Run install.sh
kevinwan
2020-12-10 22:16:03 +08:00
@beginor 这样有何好处?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/734138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX