English 中文(简体)
码头建筑中的Cache“果实”
原标题:Cache "go get" in docker build

我想把我的羊兰单位测试装成cker子,因为它取决于几个外部服务。 我的申请有许多属地,因此,在<条码>上填写<>。

我怎么能够使cker子集装箱能够在我每次想要测试时不必下载所有依赖物的情况下建造这种包裹?

My Dockerfile:

FROM golang:1.7

CMD ["go", "test", "-v"]

RUN mkdir -p /go/src/app
WORKDIR /go/src/app

COPY . /go/src/app
RUN go-wrapper download
RUN go-wrapper install

每当我进行单位测试时,我都会在以下文字上操作docker-compose up——build Backend-test:

version:  2 
services:
  ...
  backend-test:
    build:
      context: .
      dockerfile: Dockerfile
    image: backend-test
    depends_on:
      ...

但是,现在,每当我想要进行测试时,就叫到“条码”下载<>go-wrapper>,而且要完成一段时间。

解决办法? 提前感谢!

最佳回答

个人使用govendor 。 它根据 go兰供应商公约,在你的项目内保留了你的附属公司。 这仍然需要与你在建筑方面的cker照相。

但对供应商来说,有很好的理由。 例如,在你正在建造一公斤的.时,你不应成为供应商。 当你使用不同种类的依赖物时,便会产生迷惑。 只能由供应商起诉人加以补救。

So if you have a good reason not to vendor you can seperate a few steps. Putting them in the right order will speed things up.

您可制作一份字母(get.sh)和一些go 获取关于受扶养人的指令。 (你可以将这些问题纳入你的Dockerfile,但他们有线性限制)。

go get github.com/golang/protobuf/proto
go get github.com/pborman/uuid
go get golang.org/x/net/context
go get golang.org/x/net/http2
go get golang.org/x/net/http2/hpack

Then in your Dockerfile you first copy and execute the shell script. Each time you update the get.sh it will rebuild entirely. It still runs got get ./... to make sure all dependencies are there. But if everything is added in the get.sh script, you will get a decent speed boost.

FROM golang:1.6

RUN mkdir -p /go/src/app

COPY get.sh /go/src/app

WORKDIR /go/src/app

RUN bash get.sh

COPY . /go/src/app

RUN go get ./...

CMD go test -v

普遍的想法是,你经常改变你的Dockerfile中的内容,并 st住顶上的头部。 即使你必须增加另一指挥或两个指挥。 多克人将按行走,直到找到需要重建的东西,然后在这样之后也做每一个线。

问题回答

我正在寻求回答你的问题,但具有讽刺意味的是,我回答一个问题(如何迅速进行cker器测试)。 如果你真的想要快速检测,你最好在管理集装箱时避免重建。 但等待的是,如何将新的源代码放在集装箱内? 页: 1 下面是我如何确定这一点:

cker:

backend-test:
  volumes:
    - .:/path/to/myapp

当然,在图像中,有线/to/app。 你们必须明确地把这种形象传给发展中国家:

docker-compose up -f docker-compose.dev.yml

但现在,在你进行测试时,你不再使用cker器,你将再使用cker子。

docker exec -it backend-test go test

如果你行使这一权利,你在后端测试集装箱中的rc子将永远更新,因为它实际上装满了数量。 停泊集装箱和运行试验的沥滤速度应当大大快于每次新集装箱的堆积。

EDIT: 评论员正确地指出,这只会避免在你重新依赖性后改变形象(不需要<代码>go )。 唯一一点是,它不仅避免重建,而且避免重新启动。 当我做这样的测试时,我加上了一种依赖性,我通常只读到go 直接从我的测验组获得。 在您的集装箱内工作,可以找到<条码<>条/条码>,但一种办法是通过。 可悲的是,如果你想要你的建筑目标能够在进行测试之前吸引新的依赖者,那么你在建筑过程中可能需要把某些部署的关键列入你们的形象。 然而, 我的回答要点是,将建筑和试验分开,以避免在你重新准备产生最终工艺之前进行充分的建筑。

尽管如此,我认为我ight理解,我不以你要求的方式回答问题。 在废墟上,答案将简单地照抄Gemfile和Gemfile.lock,并运行bundlestal ——deploy,然后复制你本人改动的代码。 我个人不记得重建费用,因为99%的我的变化仍然涉及重建。 尽管如此,你可能会研究如何使用新布纳德受抚养人:dep。 在安装了纸浆后,我确信,你只能将<条码>(Gopkg.toml和<条码>>(Gopkg.lock)复制到你的工作室,操作<条码>dep ensure,然后复制你的代码。 只有在更新了Gopkg的情况下,才会有电离层,否则, do子将能够在安装之前的电离层后再使用。 长期ed!

由于附录已经过时,建议采用以下新办法:go 模块>:.migration path

With go modules adding cache layer is simple as adding following steps:

FROM golang:1.18-buster
WORKDIR /go/app/myapp

COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 go build .

The copy mod and sum file will take care of invalidating cache od download command. By the way the CGO_ENABLED=0 allows build to run on Alpine Linux. Set it to 1 for dynamic glibc linking.

现有 多尔,人们可以使用更多的骗子,以切除和加快建造:

RUN --mount=type=cache,target=/root/go/pkg/mod 
    --mount=type=cache,target=/root/.cache/go-build 
    go build app.go

没有必要在“建造”之前“获得/下载”。

首先是为根本用户和缺省配置工作。 使用<代码>go env GOCACHE和go envGOMODCACHE,以获得您具体途径的数值。

Docker documentation of this feature is here: https://docs.docker.com/build/cache/#use-the-dedicated-run-cache - with the caveat that they don t mention one can use "--mount" more than once; but it works this way.

I actually wanted to comment on @Bogusław Kałka s answer, but due to my low reputation, I post another answer.

与Go v1.21.6一样,似乎已改变了拖欠的GOMODCACHE。

$ docker run --rm golang:1.21.6 go env | grep -e GOCACHE -e GOMODCACHE 
GOCACHE= /root/.cache/go-build 
GOMODCACHE= /go/pkg/mod 

因此,建筑指挥部应当:

RUN --mount=type=cache,target=/go/pkg/mod 
    --mount=type=cache,target=/root/.cache/go-build 
    go build app.go




相关问题
run unit tests and coverage in certain python structure

I have some funny noob problem. I try to run unit tests from commandline: H:PROpyEstimator>python src estpython est_power_estimator.py Traceback (most recent call last): File "src est...

How to unit-test an enterprise symfony project?

I´m working on a huge project at my work. We have about 200 database tables, accordingly a huge number of Models, Actions and so on. How should I begin to write tests for this? My biggest problem ...

Code Coverage Tools & Visual Studio 2008 Pro

Just wondering what people are using for code coverage tools when using MS Visual Studio 2008 Pro. We are using the built-in MS test project and unit testing tool (the one that come pre-installed ...

Unit testing. File structure

I have a C++ legacy codebase with 10-15 applications, all sharing several components. While setting up unittests for both shared components and for applications themselves, I was wondering if there ...

Unit Testing .NET 3.5 projects using MStest in VS2010

There s a bug/feature in Visual Studio 2010 where you can t create a unit test project with the 2.0 CLR. https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=483891&wa=...

Unit Test for Exceptions Message

Is there a simple (Attribute-driven) way to have the following test fail on the message of the exception. [TestMethod()] [ExpectedException(typeof(ArgumentException))] public void ExceptionTestTest() ...

热门标签