Go 1.14 模块构建命令忽略 Docker 中的供应商目录
Go 1.14 Modules Build Command Ignoring Vendor Dir in Docker
如何让 Docker 中的 go build
命令在每次构建时使用模块缓存或供应商目录,除非依赖项已更改?
我已经尝试了这两种方法,但结果不一致:
^ 这不起作用,我相信是因为我使用的是 Docker "builder" 模式。
https://medium.com/@monirz/golang-dependency-solution-with-go-module-and-docker-8967da6dd9f6
^ 这应该可行,但由于某种原因行不通...
我在服务器上工作,对于我对 go 源代码所做的每一个小改动,我都需要重新编译,但它 而不是 有意义的是,该步骤还必须每次都重新下载所有依赖项。
我正在将此服务器构建为 go module
,这是我当前的 Docker 文件:
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 在模块路径(在那里)。
供应商文件被使用了,只是看起来不像,因为虽然它没有重新下载所有模块在构建时 是 重新 构建 它们在每个构建中。问题似乎是尝试使用构建器模式,我已经更改了我的开发组合文件以处理组合 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:
如何让 Docker 中的 go build
命令在每次构建时使用模块缓存或供应商目录,除非依赖项已更改?
我已经尝试了这两种方法,但结果不一致:
https://medium.com/@monirz/golang-dependency-solution-with-go-module-and-docker-8967da6dd9f6 ^ 这应该可行,但由于某种原因行不通...
我在服务器上工作,对于我对 go 源代码所做的每一个小改动,我都需要重新编译,但它 而不是 有意义的是,该步骤还必须每次都重新下载所有依赖项。
我正在将此服务器构建为 go module
,这是我当前的 Docker 文件:
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 在模块路径(在那里)。
供应商文件被使用了,只是看起来不像,因为虽然它没有重新下载所有模块在构建时 是 重新 构建 它们在每个构建中。问题似乎是尝试使用构建器模式,我已经更改了我的开发组合文件以处理组合 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: