以将一个简单的go http 部署到docker为例!

方法一:构建service镜像同时拉取go镜像

Dockerfile文件

# alpine Linux发行版,该发行版的大小很小并且内置了Go

FROM golang:alpine

# 设置linux环境变量

ENV GO111MODULE=on \

CGO_ENABLED=0 \

GOOS=linux \

GOARCH=amd64

# 设置镜像内工作目录

WORKDIR /build

# 将代码复制到容器中

COPY . .

# 将代码编译成二进制可执行文件app

RUN go build -o app .

# 移动到用于存放生成的二进制文件的 /dist 目录

WORKDIR /dist

# 将二进制文件从 /build 目录复制到/dist

RUN cp /build/app .

# 暴露端口

EXPOSE 8888

# 启动容器时运行的命令

CMD ["/dist/app"]

构建

docker build . -t goweb_appdocker run -p 8888:8888 goweb_app

方法二:分阶段构建,不保留源码文件和编译器

在最终的镜像中是不需要go编译器的,也就是说只需要一个运行最终二进制文件的容器即可。

FROM golang:alpine AS builder

# 为我们的镜像设置必要的环境变量

ENV GO111MODULE=on \

CGO_ENABLED=0 \

GOOS=linux \

GOARCH=amd64

# 移动到工作目录:/build

WORKDIR /build

# 将代码复制到容器中

COPY . .

# 将我们的代码编译成二进制可执行文件 app

RUN go build -o app .

###################

# 接下来创建一个小镜像

###################

FROM scratch

# 从builder镜像中把/dist/app 拷贝到当前目录

COPY --from=builder /build/app /

# 需要运行的命令

ENTRYPOINT ["/app"]

方法三:本地跨平台编译后,丢到服务器

交叉编译(跨平台编译)

Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序。golang中跨平台交叉编译涉及两个重要的环境变量:GOOS 和 GOARCH,分别代表 Target Host OS 和 Target Host ARCH。

比较重要的几个参数

GOARCH="amd64" // 程序构建环境的目标计算架构

GOOS="linux" // 程序构建环境的目标操作系统

CGO_ENABLED="1" // 指明cgo工具是否可用的标识

命令公式

CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go build -o ${name} main.go

name:编译后app的名称,默认为gomod的包名 os:目标os,大致有如下一堆: arch:架构

举例

Mac 下编译 Linux 和 Windows 64位可执行程序: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go​

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Linux 下编译 Mac 和 Windows 64位可执行程序: CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go​

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Windows 下编译 Mac 和 Linux 64位可执行程序: CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go​

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

提示:如果win命令行提示'CGO_ENABLED' 不是内部或外部命令,也不是可运行的程序 或批处理文件。可以用git bash去编译。

加执行权限,chmod +x web,然后执行,访问页面。(嫌开放端口之类的麻烦就把防火墙禁掉)