使用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年发布的版本中引入的一种写法,所以很多时候我们需要与时俱进学习新技术。很显然我已经落后来将近两年了,因为今天我才知道这种写法。主要参考如下这篇文章

Using Docker Multi-stage builds during development

原文地址:https://www.cnblogs.com/landpack/p/10757350.html