以将一个简单的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:架构
举例
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
'CGO_ENABLED' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
chmod +x web