docker 製作go鏡像

1.首先編寫dockerfile 文件

#使用基礎的官方鏡像
FROM golang:1.17-alpine As build
#工作目錄
WORKDIR /project/
#複製
COPY . /project
#製作鏡像的時候運行 設置 go代理, 設置go mod 模式
RUN go env -w GOPROXY=https://goproxy.io,direct
RUN go env -w GO111MODULE=on
#編譯二進制文件 Go的runtime環境變量CGO_ENABLED=1,即默認開始cgo,允許你在Go代碼中調用C代碼

#CGO_ENABLED 如果標準庫中是在CGO_ENABLED=1情況下編譯的,那麼編譯出來的最終二進制文件可能是動態鏈接,
#   所以建議設置 CGO_ENABLED=0以避免移植過程中出現的不必要問題。
# GOOS 編譯目標平臺上的操作系統(darwin, freebsd, linux, windows)
# GOARCH 編譯目標平臺上的硬件體系架構(amd64, 386, arm, ppc64等)
RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o hello   hello.go


FROM alpine
ENV TZ Asia/Shanghai
COPY --from=build /project/hello /project/hello

#定義工作目錄爲project
WORKDIR /project

#CMD ["./hello"]
#聲明鏡像使用80端口 並不代表可以 直接訪問此端口
EXPOSE 80
#容器啓動命令
ENTRYPOINT  ["./hello"]

2.編寫hello.go文件

package main

import (
    "fmt"
    "net/http"
)

func Hello(w http.ResponseWriter, r *http.Request) {
    fmt.Println("handle hello") //服務端打印輸出
    fmt.Fprintf(w, "hello GoLandWEB")

}
func login(w http.ResponseWriter, r *http.Request) {
    fmt.Println("handle login")
    fmt.Fprintf(w, "login ...")

}
func main() {
    http.HandleFunc("/", Hello)
    http.HandleFunc("/login", login)
    err := http.ListenAndServe("0.0.0.0:80", nil)
    if err != nil {
        fmt.Println("http listen failed")
    }
}

3.執行docker build 命令

docker build -t hello:v2  .

4.查看鏡像 docker images

 

5.啓動容器

[root@k8s-master httpdemo]# docker run -p 80:80 hello:v2
handle hello
handle hello

6.訪問測試

[root@k8s-master zhangxueqing]# curl 127.0.0.1:80
hello GoLandWEB

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章