文章目录
1. 目录结构
docker_test
├── Dockerfile
└── main.go
2. 操作命令
docker build -t docker_test .
docker run -p 8080:8080 -it docker_test
3. 遇到的问题
3.1 package DockerTest: no go files in /go/src/DockerTest
原因在于Dockerfile中漏写了COPY . .
,即需要将Dockerfile当前目录中的文件全部添加到Docker的工作目录中。
3.2 COPY failed: stat src/DockerTest/main: file does not exist
原因在于Dockerfile的第一阶段选择了golang:1.16
作为起始镜像,此时$GOPATH
默认为/go
。第二阶段则选择了scratch
作为起始镜像,scratch
中并没有$GOPATH
,因此COPY --from=builder
的路径没有写对,应该将$GOPATH
直接写成/go
。
- standard_init_linux.go: 219:: exec user process caused: no such file or directory
原因在于选择了scratch
作为起始镜像,那么就应相应地禁止CGO, 在go build
命令之前设置CGO_ENABLED=0
.
4. 完整代码
main.go
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("", func(c *gin.Context) {
c.JSON(200, gin.H {
"message": "hello",
})
})
r.Run()
}
Dockerfile
FROM golang:1.16 as builder
MAINTAINER user<user@example.com>
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct
WORKDIR $GOPATH/src/DockerTest
# 将当前目录同步到docker工作目录下
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main .
FROM scratch
MAINTAINER user<user@example.com>
ENV GIN_MOD=release
WORKDIR /DockerTest
COPY --from=builder /go/src/DockerTest/main .
EXPOSE 8080
ENTRYPOINT ["./main"]