2.使用Docker部署Golang编译环境

查找Docker中Golang的版本

golang in docker
其中

  • rc 是release candidate的缩写。是发布正式版之前的 发布候选版,用于公测
  • beta 是测试版本
  • 在这里插入图片描述

一、只编译不运行

先将代码放在指定目录,然后进入该目录。
app.go

 package main 
 import(
	 "fmt"
 )

 func main(){
	 fmt.Println("hello world!")
 }

在这里插入图片描述
执行如下代码:

docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.13.5-alpine go build -v
# go build -v在编译时打印软件包的名称。

在这里插入图片描述
在这里插入图片描述
这会将当前目录作为卷添加到容器中,
将工作目录设置为该卷,
然后运行命令go build,
该命令将指示go编译工作目录中的项目并将可执行文件输出到myapp。

依赖的镜像是golang:1.13.5-alpine,容器编译完成会被删除
在这里插入图片描述

二、在Docker容器中交叉编译您的应用

交叉编译

docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 golang:1.13.5-alpine go build -v

三、一次为多个平台构建

$ docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.13.5-alpine bash
$ for GOOS in darwin linux; do
>   for GOARCH in 386 amd64; do
>     export GOOS GOARCH
>     go build -v -o myapp-$GOOS-$GOARCH
>   done
> done 

四、可以构建并运行Docker映像

先准备一个dockerfile,放在源码目录。

FROM golang:1.13.5-alpine
WORKDIR /go/src/app
COPY . .
RUN go get -d -v ./...
RUN go install -v ./...
CMD ["app"]

在这里插入图片描述

#编译镜像
$ docker build -t my-golang-app .
#根据编译好的镜像运行容器,运行完成会删除中间容器
$ docker run -it --rm --name my-running-app my-golang-app

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、多阶段构建

  • 下面的Dockerfile中有两个阶段,第一个阶段是编译app,第二个阶段是把编译好的二进制文件app拷贝到/root然后在/root目录下运行。
  • 其中这两个阶段可以一起构建,也可以分别单独构建。
  • COPY --from=xxx可以从其他镜像中拷贝文件,强大的很。
FROM golang:1.9-alpine as builder
RUN apk --no-cache add git
WORKDIR /go/src/github.com/go-sql-driver/mysql
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest as prod 
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/go/helloword/app .
CMD ["./app"]

#完整构建
#docker build -t go/helloword:3 .
#只构建某一阶段镜像
#docker build --target builder -t username/imagename:tag .
#构建时从其他镜像复制文件
#COPY --from=nginx:latest /etc/nginx.nginx.conf /nginx.conf 
#
#

六、go mod项目的编译

这里的区别就是需要指定一个环境变量。
众所周知,因为不可抗力因素,国内无法访问sumdb,就无法访问国外的依赖,所以就需要通过手段来代理访问,解决国内go1.13的go mod无法安装依赖的问题。
所以这里就需要把代理加上。

docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOPROXY=https://goproxy.cn,direct golang:1.13.5-alpine go build -v

七、window10 pro下编译

windows10专业版打开hyper-V,再安装docker,然后执行下面的命令即可。
目前docker支持Linux容器和windows容器,可以进行切换:switch to windows containers.

G:/mypro/myapp使我们项目的目录,一般都会使用go mod来脱离gopath
这里-v指定volume的时候用绝对路径,cmd下不支持"$PWD"

docker run --rm -v G:/mypro/myapp:/usr/src/myapp -w /usr/src/myapp -e GOPROXY=https://goproxy.cn,direct golang:1.13.5-alpine go build -v

问题1:使用cmd不会报错
我在git-bash执行的该命令,报错如下
The source path “G:/mypro/myapp;C” doesnt exist…

原因是git-bash尝试补全造成的问题,那就想办法不要补齐或者强制转义。stackoverflow的高分解答表示,在path前加/可以实现跳过path的书写转义规定。
后面的-w的workdir也要加上/,否则也会报错

docker run --rm -v /G:/mypro/myapp://usr/src/myapp -w //usr/src/myapp -e GOPROXY=https://goproxy.cn,direct golang:1.13.5-alpine go build -v

问题2:
docker: Error response from daemon: Drive has not been shared
解决办法:

右击“docker desktop is runing”(电脑右下角) 
点击“settings" 
再点击“shared Drives”
然后把磁盘都勾上

在这里插入图片描述

八、windows10 pro下交叉编译

G:/mypro/myapp使我们项目的目录,一般都会使用go mod来脱离gopath

docker run --rm -v G:/mypro/myapp:/usr/src/myapp -w /usr/src/myapp -e GOPROXY=https://goproxy.cn,direct -e CGO_ENABLED=0 -e GOOS=windows -e GOARCH=amd64 golang:1.13.5-alpine go build -v

总结

在不改变当前操作系统环境的情况下,可以使用docker快速编译golang,而且资源占用也少。
而且可以为自己的项目单独构建一个满足该项目依赖的项目编译环境的docker镜像,这样你的编译环境就是可以随处迁移的。可以放在私有仓库,也可以放在docker hub。比没换台电脑就部署一套编译环境强得多。

附录

命令参数介绍

docker build 
-f 指定dockerfil路径
--force-rm 设置镜像过程中删除中间容器
--rm 设置镜像成功后删除中间容器
--no-cache 创建镜像的过程不适用缓存
--pull 尝试去更新镜像的新版本
--tag/-t  设置镜像的名字和标签

docker run 
--name="xxx" 为容器指定一个名称
--volume/-v
--workdir/-w  指定容器内的目录
--env/-e  设置环境变量


go get 
-d 只执行下载动作,不执行安装动作
-u 更新已有代码包和依赖包
-v 打印吹被构建的代码包的名字
-x 打印出用到的命令

go get -d ./...(加载所有依赖项)

go build 
-v 在编译时打印软件包的名称。

发布了264 篇原创文章 · 获赞 23 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Edu_enth/article/details/103613799
今日推荐