最近在思考一个问题,我的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
可以看到如下结果:
使用docker构建简约高效的镜像

优化版

首先来看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 .

查看镜像最终结果

使用docker构建简约高效的镜像

总结

第二个dockerfile是从17年发布的版本中引入的一种写法,所以很多时候我们需要与时俱进学习新技术。很显然我已经落后来将近两年了,因为今天我才知道这种写法。主要参考如下这篇文章

Using Docker Multi-stage builds during development

相关文章:

  • 2021-11-02
  • 2021-05-25
  • 2021-11-28
  • 2021-09-11
  • 2021-09-28
  • 2021-09-10
猜你喜欢
  • 2021-07-05
  • 2021-08-29
  • 2022-01-07
  • 2022-12-23
  • 2021-12-03
  • 2021-05-29
相关资源
相似解决方案