使用docker构建简约高效的镜像
背景介绍
最近在思考一个问题,我的golang运行到docker环境上的时候,需要安装很大依赖。思考发现我需要就是一个运行二进制的环境而已并不需要golang的编译器等等其他任何多余的。
当前的docker镜像
创建一个测试目录,主要会包含你的工程文件和一个dockerfile文件
mkdir ~/dockerfileTest
cd ~/dockerfileTest
我的hello.go和Dockerfile文件如下
CN-MAC-013:dockerfileTest frank$ cat hello.go
package main
import (
"fmt"
"time"
)
func main() {
for {
time.Sleep(time.Second * 2)
fmt.Println("Hello World")
}
}
常规的dockerfile写法
CN-MAC-013:dockerfileTest frank$ cat Dockerfile
From golang:latest
WORKDIR /app/hello
COPY ./ /app/hello
RUN go build hello.go
CMD ./hello
运行构建一个镜像
docker build -t hello-general .
查看镜像的大小
docker images
可以看到如下结果:
优化版
首先来看dockerfile,hello.go代码不变。
CN-MAC-013:dockerfileTest frank$ cat Dockerfile
From golang:latest as build-env
WORKDIR /app/hello
COPY ./ /app/hello
RUN go build hello.go
FROM alpine
WORKDIR /app/hello
COPY --from=build-env /app/hello/hello ./
CMD ./hello
通过如下方式构建
build -t hello-best .
查看镜像最终结果
总结
第二个dockerfile是从17年发布的版本中引入的一种写法,所以很多时候我们需要与时俱进学习新技术。很显然我已经落后来将近两年了,因为今天我才知道这种写法。主要参考如下这篇文章
Can we drop this masquerade