Go 应用程序 Dockerfile 总是在重新启动时下载模块

Mik*_*ike 4 go docker docker-compose

我已经使用Go语言编写了一个应用程序,并Dockerfile为其创建了一个应用程序,如下所示。问题是每次我重新启动 docker 容器时,所有模块都会重新下载。

FROM golang:1.15-alpine
WORKDIR /my-app
COPY . .
RUN go run main.go
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Meh*_*dEP 6

Docker 将缓存每个层,如果它们与之前运行的相同,则使用它们。您的问题Dockerfile是您没有添加用于下载模块的层,并且您没有构建应用程序(您每次都运行它)。我假设您正在go为依赖项使用模块,因此这里是针对您的依赖项的修复Dockerfile

FROM golang:1.15-alpine
WORKDIR /my-app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -i -o ./build/my-app
ENTRYPOINT ["./build/my-app"]
Run Code Online (Sandbox Code Playgroud)

这样,Dockerfile下载过程将被缓存并在每次重新启动时重用(除非您更改依赖项)。