Skip to content

1. go目录结构

# 项目目录信息
$ tree go-container 
go-container
├── Dockerfile
├── go.mod
├── go.sum
└── main.go
# 项目目录信息
$ tree go-container 
go-container
├── Dockerfile
├── go.mod
├── go.sum
└── main.go

main.go

go
package main
import (
 "github.com/gin-gonic/gin"
 "os"
 "time"
)

func main() {
 engine := gin.Default()
 engine.GET("/", func(context *gin.Context) {
  // 显示主机名字
  hostName, _ := os.Hostname()
  context.JSON(200, gin.H{
   "version":  "v1",
   "hostName": hostName,
   "time":     time.Now().Format("2006-01-02 15:04:05"),
  })
 })
 _ = engine.Run(":80")
}
package main
import (
 "github.com/gin-gonic/gin"
 "os"
 "time"
)

func main() {
 engine := gin.Default()
 engine.GET("/", func(context *gin.Context) {
  // 显示主机名字
  hostName, _ := os.Hostname()
  context.JSON(200, gin.H{
   "version":  "v1",
   "hostName": hostName,
   "time":     time.Now().Format("2006-01-02 15:04:05"),
  })
 })
 _ = engine.Run(":80")
}

2. 制作镜像

Dockerfile

yaml
# Golang版本;Alpine镜像的体积较小。
FROM golang:1.18 as builder

# 将代码复制到构建镜像中。
ADD . /workspace
WORKDIR /workspace

# 挂载构建缓存。
# GOPROXY防止下载失败。
RUN --mount=type=cache,target=/go \
  env GOPROXY=https://goproxy.cn,direct \
  go build -buildmode=pie -ldflags "-linkmode external -extldflags -static -w" \
  -o /workspace/gin-hello

# 运行时镜像。
# Alpine兼顾了镜像大小和运维性。
FROM alpine:3.14
EXPOSE 8080
# 复制构建产物。
COPY --from=builder /workspace/gin-hello /app/

# 指定默认的启动命令。
CMD ["/app/gin-hello"]
# Golang版本;Alpine镜像的体积较小。
FROM golang:1.18 as builder

# 将代码复制到构建镜像中。
ADD . /workspace
WORKDIR /workspace

# 挂载构建缓存。
# GOPROXY防止下载失败。
RUN --mount=type=cache,target=/go \
  env GOPROXY=https://goproxy.cn,direct \
  go build -buildmode=pie -ldflags "-linkmode external -extldflags -static -w" \
  -o /workspace/gin-hello

# 运行时镜像。
# Alpine兼顾了镜像大小和运维性。
FROM alpine:3.14
EXPOSE 8080
# 复制构建产物。
COPY --from=builder /workspace/gin-hello /app/

# 指定默认的启动命令。
CMD ["/app/gin-hello"]

2.1 构建镜像

docker build -t test/gin-hello:v1 .
docker build -t test/gin-hello:v1 .