通常大家构建 Go 镜像都在 Dockerfile 中使用了 FROM golang:latest
命令,然而这样构建出来的镜像 非常大!!!
如果您希望缩小镜像的体积,那么 scratch 镜像 会是一个不错的选择。因为,scratch 镜像是一个 空镜像!
接下来,Ficow 就根据自己的实际经验来讲解如何基于 scratch 镜像构建一个 最小 的 Go 应用镜像。
首先,这是演示项目的大致文件结构:
然后,这是对应的 Dockerfile
内的配置:
FROM scratch
ENV RUN_MODE_FROM_ENV release
WORKDIR /app
ADD ca-certificates.crt /etc/ssl/certs/
ADD . /app
EXPOSE 8005
ENTRYPOINT ["./app_api"]
接下来,Ficow 会对以上命令进行逐行解释:
FROM scratch
,基于 scratch 镜像构建本镜像;ENV RUN_MODE_FROM_ENV release
,设置环境变量 RUN_MODE_FROM_ENV
的值为: release,您可以根据自己的需要来配置不同环境变量;WORKDIR /app
,将镜像中的工作目录设置为 /app
,您也可以选择其他的目录;ADD ca-certificates.crt /etc/ssl/certs/
,将 SSL 证书添加到容器中的指定目录(缺失该文件可能导致容器中无法正常使用HTTPS);ADD . /app
,将当前目录中的所有文件拷贝到镜像的 /app
目录中,也就是工作目录中,您可以根据自己的需要来进行拷贝;EXPOSE 8005
,对 Docker 容器外部开放 8005 端口,比如:Nginx 需要把请求转发给 Go 后端应用,那就需要开放容器的端口给外部;ENTRYPOINT ["./app_api"]
,设置 Docker 容器启动的入口,也就是启动容器时就会启动这个入口,./app_api
也就是 Ficow 构建的 Go 后端应用;
如果您没有配置 SSL 证书,并遇到了 X509: Certificate Signed by Unknown Authority
错误,那么您可以参考 Ficow 的这篇文章:
Docker 中使用 scratch 镜像构建 Go 应用镜像,容器报错:X509: Certificate Signed by Unknown Authority
由于使用了 scratch 镜像,我们构建 Go 应用的方式也需要改变。因为我们最常使用的 go build .
命令是动态链接了库文件的,而 scratch 镜像中不具备这些库的内容。
现在,我们需要在构建应用时就链接静态库:
# 将 app_api 改为您的可执行文件名即可,需要和 Dockerfile 中的 ENTRYPOINT 命令使用的名称相同
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app_api .
在项目的根目录执行以上命令,您即可在该目录中看到生成的可执行文件。
Ficow 建议您将该命令编写到 Makefile
文件中,然后将这个 Makefile
保存到项目根目录中。该文件的内容如下:
docker-build:
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app_api .
docker build -t repo_name/image_name . # 请替换 repo_name/image_name 为您的镜像
以后,您就可以通过以下命令来执行以上两条命令:
make docker-build
当然,您还可以在这个 Makefile
文件中添加更多的命令,比如:
docker-push:
docker push repo_name/image_name # 请替换 repo_name/image_name 为您的镜像
简单,快捷,而且很好用~
用 Docker 来构建、部署、运行 Go 应用,真的很惬意!!!使用了 scratch 镜像之后,push 的速度也非常快,部署的节奏简直飞起来~
朋友,如果您还没有开始使用 Docker 来部署应用到云服务器上,那就赶快用起来吧~
如果您发现 Docker 官方提供的 Registry 传输速度太慢
,您可以参考 Ficow 的这篇文章:
使用腾讯云容器镜像仓库代替 Docker 官方的 Docker Registry
参考内容(感谢作者 🙌):
「连载九」将Golang应用部署到Docker
创建超小的Golang docker 镜像
觉得不错?点个赞呗~
本文链接:基于 scratch 镜像为 Go 后端应用构建最小的 Docker 镜像
转载声明:本站文章如无特别说明,皆为原创。转载请注明:Ficow Shen's Blog