在Windows平台使用Docker打包Go项目

Docker是使用Go开发的应用容器,采用虚拟化技术和精简的Linux,将所有的应用在一个简单的应用环境中进行运行,可以对这个容器 进行单独的启动停止,而这些容器中的错误和进程的停止也不会影响到其他的容器和系统中的进程。

Windows中也支持Docker,可以在开发环境中制作Linux镜像,将该镜像推送至私有(公有)镜像服务器,不在需要特定的部署和对于环境的依赖。 在Win7中的镜像需要VM虚拟机的支持,而Win10中则是采用了Windows自带虚拟机Hyper。

对于Go项目而言,Docker官方提供了专门用于Golang编译的镜像,可以通过创建该镜像进行编译代码后使用,但是整个镜像比较大并不方便部署,并且只是作为 项目的运行环境,Go支持交叉编译,也就是说,可以在Windows平台中提前编译好该项目的Linux版本,就可以直接在任意版本的Linux创建相应镜像。

Go的编译需要设置三个系统变量,然后运行go build命令

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 
go build

其中CGO_ENABLED用于是否关闭CGOGOOS设置的是目标操作系统,而GOARCH则设置的是系统的架构,有下方的一些组合。

$GOOS        $GOARCH
android     arm
darwin      386
darwin      amd64
darwin      arm
darwin      arm64
dragonfly   amd64
freebsd     386
freebsd     amd64
freebsd     arm
linux       386
linux       amd64
linux       arm
linux       arm64
linux       ppc64
linux       ppc64le
linux       mips
linux       mipsle
linux       mips64
linux       mips64le
netbsd      386
netbsd      amd64
netbsd      arm
openbsd     386
openbsd     amd64
openbsd     arm
plan9       386
plan9       amd64
solaris     amd64
windows     386
windows     amd64

编译完成的代码文件应当是一个可以直接执行的“应用程序”,该程序可以在目标系统中直接启动运行。

接着需要编辑Dockerfile文件,该文件是创建镜像的Docker配置文件,指定了镜像创建的根源系统以及创建时系统的执行脚本,启动时的命令等。 其基本的结构如下方所示。

其中alpine是一个精简的Linux运行环境,而WORKDIR指定了进入系统时的目录,该文件创建在编译文件的同一级目录,所以采用了COPY命令将该文件夹下 web项目都复制进入镜像的 / 目录。EXPOSE指定了开放的端口,这里是8080端口,在启动镜像时可以选择端口映射,将80端口映射至该镜像的8080端口中。

因为本实例中并没有依赖其他的环境,也不需要在镜像中进行代码的编译,则直接执行web程序即可,则使用ENTRYPOINT进行启动命令的指定(这里 可以注意下CMD命令和该命令的差别,一般CMD用于存放参数或者是默认版本)

FROM alpine

WORKDIR /

COPY ./web /

EXPOSE 8080

ENTRYPOINT ["./web"]

如果创建好了这个项目的镜像,则接下来需要使用docker run -it -p 80:8080 镜像名称启动该镜像,该镜像会自动的根据配置运行web这个 以及完成打包的项目,而该项目就是Gin提供的Web服务。

链接