基于 scratch 镜像为 Go 后端应用构建最小的 Docker 镜像

| Docker , Go

 

内容概览

  • 前言
  • 在 Dockerfile 中使用 scratch 镜像
  • 静态链接可执行文件
  • 使用 Makefile 简化操作步骤
  • 总结

 

前言

 

通常大家构建 Go 镜像都在 Dockerfile 中使用了 FROM golang:latest 命令,然而这样构建出来的镜像 非常大!!!

如果您希望缩小镜像的体积,那么 scratch 镜像 会是一个不错的选择。因为,scratch 镜像是一个 空镜像

接下来,Ficow 就根据自己的实际经验来讲解如何基于 scratch 镜像构建一个 最小 的 Go 应用镜像。

 

在 Dockerfile 中使用 scratch 镜像

 

首先,这是演示项目的大致文件结构:

然后,这是对应的 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 .

在项目的根目录执行以上命令,您即可在该目录中看到生成的可执行文件。

 

使用 Makefile 简化操作步骤

 

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

评论区(期待你的留言)