最简单的 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

8250 次点击
所在节点    推广
64 条回复
kieoo
2020-12-10 22:47:32 +08:00
@feelinglucky 使用 docker golang build 有个问题, go mod download 等于要重新拉所有的依赖包, 打包时间会变长; 在 builder 机器上可以有缓存, 减少包时间
cs419
2020-12-10 23:00:24 +08:00
最简单!! 没有之一!!

分明是钓鱼呀
集思广益 让大伙提供优化思路
joesonw
2020-12-10 23:14:35 +08:00
不要用 alpine 用 google 的 distroless
chazyu1996
2020-12-10 23:49:18 +08:00
这样每次 build 都会去拉 mod 依赖项,建议在本地编译,或者把 GOPATH COPY 进去,不然会很慢
Lemeng
2020-12-10 23:57:21 +08:00
集思广益
dreamusername
2020-12-11 00:33:55 +08:00
不够简单,应该要尽量减少分层,一个 apk add 你写了 3 行
wellsc
2020-12-11 00:36:31 +08:00
@dreamusername 说到点子上了,写 docker file 最需要注意的就是 layer 了
xuzhzzz
2020-12-11 01:52:32 +08:00
go build 总要拉私有的包吧,这个权限怎么处理的呢?看到你的 dockerfile 里没有处理相关的
我的做法是 COPY ~/.netrc,感觉比较蠢,大家都是咋做的
dayeye2006199
2020-12-11 03:02:48 +08:00
分享个 google 项目的示例写法:

---
# Build the manager binary
FROM golang:1.13 as builder

WORKDIR /workspace
# Copy the Go Modules manifests
COPY go.mod go.mod
COPY go.sum go.sum
# cache deps before building and copying source so that we don't need to re-download as much
# and so that source changes don't invalidate our downloaded layer
RUN go mod download

# Copy the go source
COPY main.go main.go
COPY api/ api/
COPY controllers/ controllers/

# Build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -o manager main.go

# Use distroless as minimal base image to package the manager binary
# Refer to https://github.com/GoogleContainerTools/distroless for more details
FROM gcr.io/distroless/static:nonroot
WORKDIR /
COPY --from=builder /workspace/manager .
USER nonroot:nonroot

ENTRYPOINT ["/manager"]
---
dayeye2006199
2020-12-11 03:04:51 +08:00
再推荐个 Dockerfile 的 linter,可以找到一些比较有问题的 Dockerfile 写法问题,例如不恰当分层,权限过高,标签不恰当啊之类的。
https://github.com/hadolint/hadolint
kevinwan
2020-12-11 03:17:17 +08:00
@dreamusername master 已经改掉了,只是文章不能编辑👍🏻
kevinwan
2020-12-11 03:19:44 +08:00
@dayeye2006199 感觉跟我写的版本相差不大,有劳指出差别哈,btw: 层已合并
kevinwan
2020-12-11 03:20:08 +08:00
@dayeye2006199 谢谢,明天试试👍🏻
kevinwan
2020-12-11 03:22:31 +08:00
@cs419 开源的本质就是集思广益,再回馈社会嘛🤝
beginor
2020-12-11 07:55:05 +08:00
@lwch alpine 自带的不是 glibc 而是 musl c, 如果不能迁移到 musl 的话,alpine 并没有太大的体积优势。
beginor
2020-12-11 07:57:12 +08:00
@kevinwan shell 比 dockerfile 容易调试, 至少可以一行一行的输入进行测试; 而且这样做镜像只有一层, 编译出来的镜像有体积优势
beginor
2020-12-11 07:59:57 +08:00
@kieoo golang 还好了, 要是 node 的话, 每次都要执行 npm ci 才真是折磨
kaka6
2020-12-11 08:45:27 +08:00
go 现在还用 GO111MODULE 吗,1.4 以后好像升级了,包管理更方便了,一直还没去试
kevinwan
2020-12-11 08:54:48 +08:00
@beginor 这样吃不上缓存层
kevinwan
2020-12-11 08:55:27 +08:00
@kaka6 1.14 默认 auto,我记得 1.15 默认 on 了

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

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

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

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

© 2021 V2EX