gpt4 book ai didi

docker - Go 1.14 模块构建命令忽略 Docker 中的 vendor 目录

转载 作者:行者123 更新时间:2023-12-01 22:22:45 25 4
gpt4 key购买 nike

我如何获得 go build Docker 中的命令在每个构建中使用模块缓存或 vendor 目录,除非依赖关系发生了变化?

我已经尝试了这两种方法,但结果不一致:

How can I persist go 1.11 modules in a Docker container?
^ 这不起作用,我相信因为我使用的是 Docker “builder” 模式。

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 在模块路径中检测到 vendor 目录(在那里),它应该已经自动使用该标志。

最佳答案

vendor 文件正在被使用,它看起来不像,因为虽然它没有重新下载构建它的所有模块在每次构建时重新构建它们。问题似乎是在尝试使用构建器模式,我已经更改了我的开发 compose 文件以处理 compose 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 1.14 模块构建命令忽略 Docker 中的 vendor 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61957172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com