以將一個(gè)簡(jiǎn)單的go http 部署到docker為例!
方法一:構(gòu)建service鏡像同時(shí)拉取go鏡像
Dockerfile文件
# alpine Linux發(fā)行版,該發(fā)行版的大小很小并且內(nèi)置了Go
FROM golang:alpine
# 設(shè)置linux環(huán)境變量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 設(shè)置鏡像內(nèi)工作目錄
WORKDIR /build
# 將代碼復(fù)制到容器中
COPY . .
# 將代碼編譯成二進(jìn)制可執(zhí)行文件app
RUN go build -o app .
# 移動(dòng)到用于存放生成的二進(jìn)制文件的 /dist 目錄
WORKDIR /dist
# 將二進(jìn)制文件從 /build 目錄復(fù)制到/dist
RUN cp /build/app .
# 暴露端口
EXPOSE 8888
# 啟動(dòng)容器時(shí)運(yùn)行的命令
CMD ["/dist/app"]
構(gòu)建
docker build . -t goweb_app
docker run -p 8888:8888 goweb_app
方法二:分階段構(gòu)建,不保留源碼文件和編譯器
在最終的鏡像中是不需要go編譯器的,也就是說(shuō)只需要一個(gè)運(yùn)行最終二進(jìn)制文件的容器即可。
FROM golang:alpine AS builder
# 為我們的鏡像設(shè)置必要的環(huán)境變量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 移動(dòng)到工作目錄:/build
WORKDIR /build
# 將代碼復(fù)制到容器中
COPY . .
# 將我們的代碼編譯成二進(jìn)制可執(zhí)行文件 app
RUN go build -o app .
###################
# 接下來(lái)創(chuàng)建一個(gè)小鏡像
###################
FROM scratch
# 從builder鏡像中把/dist/app 拷貝到當(dāng)前目錄
COPY --from=builder /build/app /
# 需要運(yùn)行的命令
ENTRYPOINT ["/app"]
方法三:本地跨平臺(tái)編譯后,丟到服務(wù)器
交叉編譯(跨平臺(tái)編譯)
- Golang 支持交叉編譯,在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)的可執(zhí)行程序。
- golang中跨平臺(tái)交叉編譯涉及兩個(gè)重要的環(huán)境變量:GOOS 和 GOARCH,分別代表 Target Host OS 和 Target Host ARCH。
比較重要的幾個(gè)參數(shù)
GOARCH="amd64" // 程序構(gòu)建環(huán)境的目標(biāo)計(jì)算架構(gòu)
GOOS="linux" // 程序構(gòu)建環(huán)境的目標(biāo)操作系統(tǒng)
CGO_ENABLED="1" // 指明cgo工具是否可用的標(biāo)識(shí)
命令公式
CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go build -o ${name} main.go
-
name:編譯后app的名稱,默認(rèn)為gomod的包名
-
os:目標(biāo)os,大致有如下一堆:
-
arch:架構(gòu)
舉例
-
Mac 下編譯 Linux 和 Windows 64位可執(zhí)行程序:
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位可執(zhí)行程序:
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位可執(zhí)行程序:
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' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序 或批處理文件。
可以用git bash去編譯。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-467692.html
加執(zhí)行權(quán)限,chmod +x web
,然后執(zhí)行,訪問(wèn)頁(yè)面。(嫌開放端口之類的麻煩就把防火墻禁掉)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-467692.html
到了這里,關(guān)于跨平臺(tái)編譯go(交叉編譯)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!