为了账号安全,请及时绑定邮箱和手机立即绑定

Go 1.14 模块构建命令忽略 Docker 中的供应商目录

Go 1.14 模块构建命令忽略 Docker 中的供应商目录

Go
墨色风雨 2022-06-06 15:07:48
除非依赖项已更改,否则如何go build在 Docker 中获取命令以在每次构建时使用模块缓存或供应商目录?我已经尝试了这两种方法,但结果不一致:如何在 Docker 容器中保留 go 1.11 模块? ^ 这不起作用,我相信因为我使用的是 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 sourceWORKDIR /appCOPY . .# Statically compile our app for use in a distroless containerRUN 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/distrolessFROM gcr.io/distroless/static# Copy over binary and words dirCOPY --from=builder /app/app /appENTRYPOINT ["/app"]我还尝试将-mod=vendor标志添加到 go 命令中并且它不会改变行为......如果 1.14 在模块路径中检测到供应商目录(在那里),它应该已经自动使用该标志。
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

供应商文件正在被使用,但它看起来不像,因为虽然它没有在构建时重新下载所有模块,但它在每次构建时都重新构建它们。问题似乎是在尝试使用构建器模式,我已经更改了我的开发 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:


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信