关于 Go 项目在docker环境中的部署问题

Submitted by Lizhe on Fri, 09/20/2019 - 05:17

这个问题来自于 Colin 最近的一个新项目,这个项目的技术选型符合我心目中的完美项目

如果把 Vue 换成 React 看起来就更舒服了。

他们打算使用下面这种结构

20190920012411

实际上这个模型又回到了之前我的实习生小盆友的学习项目中的问题,

Colin 他们也使用了 golang 镜像,和实习生一样,他们认为和java镜像一样,既然我使用golang,那么我需要一个golang运行环境

但是这里,golang 本身不是 动态语言或者混合语言(像java那样,既JIT又有class解释器),它实际上是一种现代 C 语言

既然Golang本身可以编译成 可执行二进制 文件,也就是说我可以理解它只需要依赖 Linux kernel 就可以了 ( 当然你也需要shell )

当然绝大多数情况只有 Kernel 是不够用的,但是这里仅就 helloworld 代码,理论上而言,Kernel 已经够用了

 

要理解这个问题,你需要考虑 docker 到底是什么的问题,再重申一遍,docker不是虚拟机

docker实际上是 “rootfs层 + 应用层 的一个包”

20190920133400

 

那既然我只是一个 不依赖特殊运行时环境的,可执行二进制文件,那我干嘛还要那么臃肿的 rootfs 层

 

package main

 

import "fmt"

 

func main() {

    fmt.Println("helloworld")

}

 

 

Dockerfile

 

FROM golang

WORKDIR /workfolder

COPY ./src .

RUN pwd

RUN ls

RUN go build -o your_app_name

FROM scratch

COPY --from=0 /workfolder/your_app_name /your_app_name

ENTRYPOINT [ "/your_app_name" ]

 

 

20190920011123

这样一个helloworld镜像就从 800多M 缩减到了 2M

不过scratch镜像可能确实太小了,具体需要安装那些依赖还要在实际环境中重新评估