以将一个简单的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_app
docker 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
,然后执行,访问页面。(嫌开放端口之类的麻烦就把防火墙禁掉)