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

 

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