Go 项目构建 Docker 镜像

在 Docker 中运行程序, go 有先天的优势,只需要通过 go build 编译成一个可执行文件,然后直接运行。同时还可以打包成最小的镜像,主要思路就是在镜像中打包一个镜像,第一层镜像中安装各种依赖的库和配置go env环境,然后通过 go 的静态编译得到可执行文件,然后再构建一个空镜像只把可执行文件打包进去就可以了,这样理论上可以得到最小体积的 go 应用的镜像,下面先上解决方案。

Dockerfile

FROM golang:1.13-buster as build-env 
WORKDIR /data/src 
ADD . /data/src 
ENV GO111MODULE=on 
ENV GOPROXY=https://goproxy.io 
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags ‘-extldflags “-static”’ -o main . 

FROM alpine:latest 
LABEL maintainer “tcitry@gmail.com” 
WORKDIR / 
COPY --from=build-env /data/src/main ./main
COPY --from=build-env /data/src/config.yml.example ./config.yml
COPY --from=build-env /data/src/entrypoint.sh ./entrypoint.sh
EXPOSE 8000

ENTRYPOINT [“/entrypoint.sh”]

Entrypoint

#!/bin/sh 
/main 

参数

GO111MODULE

文档:Modules · golang/go Wiki · GitHub

  • GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
  • GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。
  • GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。