> 文章列表 > docker打包golang应用

docker打包golang应用

docker打包golang应用

一、错误的打包方式

在本地环境编译,然后将可执行程序放入 alpine(docker.io/alpine:latest)

  1. 准备web程序

package mainimport ("fmt""net/http"
)func main() {server := &http.Server{Addr: ":8888",}http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "hello world")})fmt.Println("server startup...")if err := server.ListenAndServe(); err != nil {fmt.Printf("server startup failed, err:%v\\n", err)}
}

go build hello.go

  1. dockerfile

FROM       docker.io/alpine:latest
MAINTAINER demo <juest a demo>#alpine内的包管理
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
#安装bash
RUN apk add --update bash && rm -rf /var/cache/apk/*RUN mkdir -p /data/go
COPY hello /data/goEXPOSE 8888ENTRYPOINT ["/data/go/hello"]
  1. 构建镜像

docker build -t demo/go-hello:1.0 -f dockerfile .
  1. 将在本地生成将demo/go-hello:1.o镜像

docker打包golang应用

5.创建并运行容器

docker打包golang应用

原因:编译的hello二进制程序不是存静态程序,还依赖一些库,但这些库在alpine镜像中找不到。

二、正确的打包流程

  1. 需要放入alpine镜像里运行的go程序,可以直接使用golang:alpine来编译,但我们在golang:alpine基础上再构建一个镜像,这个镜像中包含bash、GO111MODULE、GOPROXY等环境变量。

dockerfile

FROM docker.io/golang:alpineRUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
RUN apk add --update bash && rm -rf /var/cache/apk/*# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \\CGO_ENABLED=0 \\GOOS=linux \\GOARCH=amd64\\GOPROXY=https://goproxy.cn,direct
  1. 构建自己的go编译镜像

docker build -t go-build:1.0 -f dockerfile .
docker打包golang应用
  1. 运行go-build:1.0 镜像,编译go项目代码:

#xxx为本地go代码路径
docker run -it --rm -v xxx:/data/go demo/go-build:1.0 /bin/bash
cd /data/go
go build hello.go

生成了hello可执行文件,且为纯静态的。

docker打包golang应用
  1. 将编译得到的hello二进制打入alpine:latest

dockerfile2

FROM       docker.io/alpine:latest
MAINTAINER demo <juest a demo>#alpine内的包管理
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
#安装bash
RUN apk add --update bash && rm -rf /var/cache/apk/*RUN mkdir -p /data/go
COPY hello /data/goEXPOSE 8888ENTRYPOINT ["/data/go/hello"]
  1. 打包

docker build -t demo/go-hello:1.0 -f dockerfile2 .
  1. 运行demo/go-hello:1.0

docker打包golang应用

三、使用scratch构建镜像

scratch为空镜像,适合那些没有任何外部依赖的程序,刚好前面的hello程序没有任何依赖!

  1. dockerfile3

FROM      scratch
MAINTAINER demo <juest a demo>COPY hello /EXPOSE 8888ENTRYPOINT ["/hello"]
  1. 构建

docker build -t demo/go-hello:2.0 -f dockerfile3 .

以scratch为基础构建出来的镜像是最小的

docker打包golang应用
  1. 运行

docker打包golang应用

本人学识尚浅,文章内容如果有什么不正确的地方,还请指出!