docker - Golang 构建在 docker 和 requirements.txt 等效项中
问题描述
我知道Golang requirements.txt 等价物,但问题的上下文是相当不同的。
我正在尝试优化 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 build 缓存中重用该命令。
现在我当然可以输入类似
RUN go get -d -v log fmt gopkg.in/ldap.v3
并将其放在COPY
陈述之前,但这违反了所谓的单一事实来源原则。如果我希望添加额外的导入,我将不得不在我的代码库中的两个不同位置更改相同的内容。
如何将我的导入要求存储在单独的文件中?在 Go 开发中这样做的惯用方法是什么?
解决方案
使用Go 模块。然后,像对待go.mod
a 一样对待生成的文件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 .
# ...
推荐阅读
- spring-boot - 在 Mac 上使用 Jhipster 和 maven 构建(并成功运行)一个 Jar,但无法在 Ubuntu 上运行
- python - 如何最小化python3.7应用程序docker镜像
- python - 无法捕获窗口标题python
- postgresql - jOOQ 生成成功后总是抱怨“没有找到适合createField的方法”
- c# - 实体框架扩展:带有更新语句的 BulkMerge
- image - 使用颤振从文件夹中读取图像
- android - 火炬:如何在另一个线程中注册一个火炬回调?
- python - 在 Python 中使用 __contains__ 方法
- c - 添加第二个循环
- python - 列表索引未在 for 循环中更新(python)