如何让Docker中的go build命令在每次构建中使用模块缓存或供应商目录,除非依赖项已经改变?
我尝试过这两种方法,但结果不一致:
How can I persist go 1.11 modules in a Docker container? ^这不起作用,我相信是因为我使用的是码头“构建者”模式。
https://medium.com/@monirz/golang-dependency-solution-with-go-module-and-docker-8967da6dd9f6 ^这个应该能用,但只是因为某种原因.
我正在处理一个服务器,对于我对go源代码所做的每一个小小的更改,我需要重新编译都是有意义的,但是而不是是有意义的,这个步骤也应该再次重新下载所有的依赖项,每次都是这样。
我正在将此服务器构建为一个go module,下面是我当前的Dockerfile:
FROM golang:1.14 AS builder
# Add the source
WORKDIR /app
COPY . .
# Statically compile our app for use in a distroless container
RUN CGO_ENABLED=0 go build -mod vendor -ldflags="-w -s" -v -o app .
# A distroless container image with some basics like SSL certificates
# https://github.com/GoogleContainerTools/distroless
FROM gcr.io/distroless/static
# Copy over binary and words dir
COPY --from=builder /app/app /app
ENTRYPOINT ["/app"]我还尝试将-mod=vendor标志添加到go命令中,它不会改变行为.如果1.14检测到模块路径中的供应商dir (就在那里),那么它应该已经自动使用该标志了。
发布于 2020-05-22 16:02:44
供应商文件正在使用,只是看起来不像,因为虽然它没有重新下载所有模块,但在每次构建时都是重新构建它们。问题似乎是试图使用构建器模式,我已经修改了我的开发撰写文件,以处理撰写yaml中的所有内容,并将为生产保留构建器模式Dockerfile (无论如何,这只是真正重要的)。
现在,使用下面的开发构建要快得多,并且似乎不需要在每个构建上重新编译每个模块:
docker-compose.yaml
version: "3.7"
services:
nginx:
container_name: nginx
image: nginx:alpine
restart: unless-stopped
ports:
- 8000:80
depends_on:
- api
volumes:
- ./container_spec/nginx.conf:/etc/nginx/nginx.conf
- ./container_spec/cors_support:/etc/nginx/cors_support
api:
image: golang:1.14
container_name: api
restart: always
working_dir: /app
volumes:
- .:/app
- cache:/go
expose:
- 8080
command: go run main.go
volumes:
cache:https://stackoverflow.com/questions/61957172
复制相似问题