我有一个Go项目,它有一个很大的vendor/目录,几乎从未改变过。
我正在尝试使用新的去1.10 构建缓存功能来在本地加快我在Docker中的构建。
避免重新编译我的vendor/目录就足够优化了。因此,我试图将Go等效于Python的这种常见Dockerfile模式:
FROM python
COPY requirements.txt . # <-- copy your dependency list
RUN pip install -r requirements.txt # <-- install dependencies
COPY ./src ... # <-- your actual code (everything above is cached)同样,我也尝试过:
FROM golang:1.10-alpine
COPY ./vendor ./src/myproject/vendor
RUN go build -v myproject/vendor/... # <-- pre-build & cache "vendor/"
COPY . ./src/myproject但是,这会导致“无法找到包”错误(可能是因为您无法在供应商/通常情况下直接构建组件)。
有人能弄明白吗?
发布于 2018-05-25 06:46:15
以下是一些对我有用的东西:
FROM golang:1.10-alpine
WORKDIR /usr/local/go/src/github.com/myorg/myproject/
COPY vendor vendor
RUN find vendor -maxdepth 2 -mindepth 2 -type d -exec sh -c 'go install -i github.com/myorg/myproject/{}/... || true' \;
COPY main.go .
RUN go build main.go它确保了首先安装了这些独立的库。只要你不改变图书馆,你就很好。
发布于 2018-05-25 12:29:41
只需使用go install -i ./vendor/...。
考虑以下Dockerfile:
FROM golang:1.10-alpine
ARG APP
ENV PTH $GOPATH/src/$APP
WORKDIR $PTH
# Pre-compile vendors.
COPY vendor/ $PTH/vendor/
RUN go install -i ./vendor/...
ADD . $PTH/
# Display time taken and the list of the packages being compiled.
RUN time go build -v您可以测试它执行如下操作:
docker build -t test --build-arg APP=$(go list .) .在我正在进行的项目中,没有预编译,每次使用90+包需要12秒,之后只需1.2s,只有3次(只有本地包)。
如果您仍然有“无法找到包”,这意味着有缺少供应商。重新运行dep ensure应该会修复它。
另一个不相关的提示是让您的.dockerignore从*开始。也就是说,忽略一切,然后白名单你需要什么。
发布于 2021-01-14 15:24:02
从Go 1.11开始,您将使用go模块来完成这一任务;
FROM golang
WORKDIR /src/myproject
COPY go.mod go.sum ./ # <-- copy your dependency list
RUN go mod download # <-- install dependencies
COPY . . # <-- your actual code (everything above is cached)只要go.sum不改变,由go mod download创建的图像层将从缓存中重用。
https://stackoverflow.com/questions/50520103
复制相似问题