Golang内置了docker和requirements.txt

时间:2019-07-18 14:34:06

标签: docker go

我知道Golang requirements.txt equivalent,但是问题的背景却大不相同。

我正在尝试优化docker容器内golang程序的构建。我的dockerfile看起来像这样:

FROM golang:1.12.5 as builder

WORKDIR $GOPATH/src/test-ldap/

COPY main.go .

RUN go get -d -v ./...
...

我的main.go看起来像

package main

import (
  "log"
  "fmt"
  "gopkg.in/ldap.v3"
)

func main() {
...

当然,每次我更改源代码时,docker层
COPY main.go .已更改,因此go get命令需要重新运行,即使import块未更改,也无法从Docker构建缓存中重新使用。

现在我当然可以输入类似的内容

RUN go get -d -v log fmt gopkg.in/ldap.v3

并将其放在COPY语句之前,但这违反了所谓的单一真相原理。如果我想添加额外的导入,那么我将不得不在代码库的两个不同位置更改同一件事。

如何将导入要求存储在单独的文件中?在go开发中实现此目的的惯用方式是什么?

1 个答案:

答案 0 :(得分:2)

使用Go modules。然后,像处理go.mod一样对待生成的requirements.txt文件:

FROM golang:1.12.5 as builder

# NOT in $GOPATH (or explicitly set GO111MODULES=on)
WORKDIR /usr/src/test-ldap/

COPY go.mod .
RUN go mod download  # alternatively: "go mod vendor" to build a vendor/ dir instead

COPY main.go .
# ...