Golang Go语言中制作了一个“制作 docker 最小镜像”的视频

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言中制作了一个“制作 docker 最小镜像”的视频

制作了一个构建 docker 的最小镜像的视频,上传到 B 站,分享给大家看。
希望能帮助大家稍微了解下下 docker。
希望大神们别喷,可以到 B 站提提建议。
B 站地址 https://www.bilibili.com/video/av40752125

36 回复

楼主的舌头啊…

更多关于Golang Go语言中制作了一个“制作 docker 最小镜像”的视频的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


???普通话不标准?

不是人身攻击,你这个普通话,通常意义的标准的确是没达到

file 读[faɪl],稍微注意一下比较好。
当然我也是很友好的说,没别的意思。

做的挺好的,不过楼主的发音确实可以练一下,真诚建议。

嗯嗯,好的。

谢谢,各位,还有什么不足之处,也希望大家说出来。

一个多阶段构建水了一个视频…

感觉用 alpine 会小好多

LZ 读英文单词别用日语发音,普通话不够标准=3=

表示对分享的支持,不便发表评论,并保留意见。

Dockerfile 听起来像是 Dark Fly,scratch 我好像听到的是 “script”?
不看字幕中文也听不清…


此外还有一些疑问。

先说个无聊的,后面的 “as final” 嘎哈用的?没有也一样啊。

首先,

我的脚本是这样的:

PLATFORM="$(uname -s | tr ‘A-Z’ ‘a-z’)“

export CGO_ENABLED=0
export GOOS=${PLATFORM}

export BUILD_DATE=$(date ‘+%Y%m%d%H%M%S%Z’)
export BUILD_LDFLAGS=”-X github.com/name/project/version.GitHash=$(git rev-parse HEAD | cut -c1-8) “
export BUILD_LDFLAGS=”${BUILD_LDFLAGS} -X github.com/name/project/version.BuildDate="${BUILD_DATE}" “
export BUILD_LDFLAGS=”${BUILD_LDFLAGS} “-extldflags=’-static’”“

go build -a -ldflags=”$BUILD_LDFLAGS" ./cmd/my-command

这就足以在当前目录下,从 ./cmd/my-command 寻找 main 然后生成了 binary release 了。

我们使用 go help get 得到说明:

Get downloads the packages named by the import paths, along with their
dependencies. It then installs the named packages, like ‘go install’.

这个在没有 dep 时候使用一下它下载一下依赖可以理解。但是在有 dep 后为何要保留?

其次,为啥要 copy 那些源代码目录?这远不是最小了。

要是是配置文件,建议楼主了解下 viper。docker 里面不需要贴这些配置文件的。
要是是静态文件,go-bindata 了解一下。

另外,了解一下 vendor 目录 https://blog.gopheracademy.com/advent-2015/vendor-folder/

目前有很多依赖管理工具。无论形式怎么变化,只要是缓存代码到本地到,其实就是在当前工程下的 vendor 目录下。

这些工具只有在解析代码时候有用,在 build image 时候并没有用到。

我不明白为啥还要 get 一下 godep。

源码复制过去只是为了编译用的,再二次构建的时候,只是把需要的文件复制到镜像里面,就是起了别名 final 的那次构建,

没有 get 啊, 视频里面有讲把 go get 注释掉了啊

go get godep 的包,是为了安装 godep,借用 godep 来编译的,因为我也试过直接,可能我当时测有问题吧,go build 还是会在镜像,提示包不存在的,所以 builder 构建步骤里面安装了 godep

嗯嗯,alpine 才 4m 左右

go-bindata 这个工具,我知道。他只是将静态文件打包到程序里面,得到的最终文件也不小,我一般用 upx 工具对他再压缩。

我又测了下,不需要 godep 也是可以的。谢谢

我是说

COPY --from=builder go/src/github.com/xxx/views /app/views
COPY --from=builder go/src/github.com/xxx/conf /app/conf

这一挂。

Beego 的基础项目,views 是存放页面模板文件的啊,必须要复制过去的吧,conf 是放配置文件的地方,也是需要的

Beego 的基础项目,views 是存放页面模板文件的啊,必须要复制过去的吧,conf 是放配置文件的地方,也是需要的

肯定用 alpine,现在都是主流了。

scratch 比 alpine 小,用 alpine 的多

所以我才说

> 要是是配置文件,建议楼主了解下 viper。docker 里面不需要贴这些配置文件的。
> 要是是静态文件,go-bindata 了解一下。

配置文件你要是需要默认值,那配置下 default。要是不是,config ( https://docs.docker.com/compose/reference/config/ ) 或者 etcd 才是最终归宿。

IDE 用的 JB 家的哪个?

要是还写 scala/java/… 的话,不要 goland。和 idea + go plugin 没区别

那个几乎是空镜像吧

嗯嗯,是的

嗯嗯,好的。
go-bindata 我是知道的,用与不用,看个人爱好吧,我觉得 docker 没必须,将静态文件打包到可执行程序内部。go-bindata 的作者好像已经不再维护这个项目了。
viper 这个框架是配置文件的框架,非常好的框架,谢谢,分享。我用的是 beego 的项目来演示的,而 beego 配置文件可以设定取系统环境变量的值的,所以将 conf 文件复制过去没问题的。

golang 基础环境( alpine+glibc+改时区)+add go 二进制就可以了吧
···
FROM alpine:latest
# Install base packages
RUN apk update && apk --no-cache add tzdata ca-certificates wget zlib libgcc <br> && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub && wget http://mirrors.lo
ngzhu.cn/src/glibc-2.28-r0.apk && apk add glibc-2.28-r0.apk && rm -f glibc-2.28-r0.apk /etc/apk/keys/sgerrand.rsa.pub
···

这个方案非常好,好多人都是这样干的,将程序需要的文件压缩成 zip 文件,发布到网络上(如在 github 上发版),然后 docker 里面直接下载文件,解压出来,就可以了。

您好!很高兴看到您对Go语言和Docker镜像制作感兴趣。针对您提到的“制作Docker最小镜像”的视频,以下是一些专业建议和思路,希望能帮助到您或您的观众。

在制作Docker最小镜像时,关键在于精简镜像内容,仅包含应用运行所必需的文件和依赖。以下是一些实用的步骤:

  1. 使用多阶段构建:利用Go语言的多阶段构建功能,可以在一个阶段编译Go应用,然后在另一个阶段创建一个更小的镜像来运行编译后的二进制文件。

  2. 选择基础镜像:选择尽可能小的基础镜像,如Alpine Linux,它通常比基于Debian或Ubuntu的镜像要小得多。

  3. 静态链接:确保Go应用是静态链接的,这样就不需要包含额外的动态链接库。

  4. 清理缓存和临时文件:在构建过程中,及时清理不再需要的缓存文件和临时文件,以减小镜像大小。

  5. 使用.dockerignore文件:通过.dockerignore文件排除不需要包含在镜像中的文件和目录。

  6. 优化Dockerfile:合理组织Dockerfile中的指令,尽量减少镜像层数,并使用有效的缓存策略。

通过遵循以上建议,您可以制作出既小又高效的Docker镜像,从而节省存储和传输成本,提高部署效率。希望这些建议能为您的视频内容增添更多价值!如果您有任何其他问题或需要进一步的帮助,请随时提问。

回到顶部