点击上方蓝色字体,选择“设为星标”
回复”云原生“获取基础架构实践
镜像的传统构建
我们随便找个Golang代码项目作为案例,来开始构建一个镜像。下面我们以我的一个实战项目开始讲解:https://gitee.com/damon_one/uranus
。
第一步:我们把项目代码克隆到本地:
git clone https://gitee.com/damon_one/uranus
第二步,书写其编译的Dockerfile:
FROM golang:1.20
WORKDIR /opt/app
COPY . .
go build -o hz-zeus ./zeus
CMD ["/opt/app/hz-zeus"]
这个 Dockerfile 描述的构建过程非常简单,我们首选 Golang:1.20 版本的镜像作为编译环境,将源码拷贝到镜像中,然后运行 go build 编译源码生成二进制可执行文件,最后配置启动命令。
第三步,构建镜像:
docker build -t hz-zeus -f Dockerfile .
这样编译构建的镜像会很大,这里就不展示最后的镜像信息了。
Dockerfile 优化
从上面的 Dockerfile 可以看出,我们在容器内运行了 go build -o hz-zeus ./zeus,这条命令将会编译生成二进制的可执行文件,由于编译的过程中需要 Golang 编译工具的支持,所以我们必须要使用 Golang 镜像作为基础镜像,这是导致镜像体积过大的直接原因。
既然依赖基础镜像比较大,那么我们是否可以替换为轻量级的镜像呢?发现可以将 Golang:1.20 基础镜像替换为 golang:1.20-alpine 版本。
但,这样的构建之后,发现镜像还是很大。毕竟是在镜像内镜像编译二进制文件后构建