首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用下载和缓存的所有模块依赖关系创建用于运行` module‘的docker容器

使用下载和缓存的所有模块依赖关系创建用于运行` module‘的docker容器
EN

Stack Overflow用户
提问于 2020-02-13 04:13:37
回答 2查看 2.4K关注 0票数 8

我想在一个需要使用Docker的CI环境中测试我的Go代码。如何创建go.mod中列出的所有依赖项已经下载和编译的Docker映像,以便docker run $IMG go test使用缓存的工件?

此图像所需的属性:

  • 映像只使用go.mod编译依赖项。我不想使用完整的源代码,因为对源代码的任何更改都会使持有缓存dependencies.
  • docker run $IMG go test ./...的Docker层失效,不会重新下载或重新编译go.mod.
  • Avoid试验性Docker特性中列出的依赖项。

现有办法

解析go.mod并使用go get

来自https://github.com/golang/go/issues/27719#issuecomment-578246826

这种方法是接近的,但在运行GOCACHE时,它似乎不使用go test。这似乎也会阻塞某些模块路径,比如gopkg.in/DataDog/dd-trace-go.v1

代码语言:javascript
复制
FROM golang:1.13
WORKDIR /src
COPY go.mod ./
RUN set -eu \
  && go mod graph \
  | cut -d '@' -f 1 \
  | cut -d ' ' -f 2 \
  | sort -u \
  | sed -e 's#dd-trace-go.v1#&/ddtrace#' \
  | xargs go get -v
代码语言:javascript
复制
docker run --mount /src:/src $IMG go test ./...

使用带有挂载缓存的DOCKER_BUILDKIT

最初在https://github.com/golang/go/issues/27719#issuecomment-514747274中描述。这只适用于go build。我不能将它用于go test,因为缓存挂载是在RUN命令之后卸载的,因此它在创建的Docker映像中不存在。

这也取决于试验码头的特点。

代码语言:javascript
复制
# syntax = docker/dockerfile:experimental
FROM golang:1.13 as go-builder
ARG VERSION
WORKDIR /src
COPY . /src/
# With a mount cache, Docker will cache the target directories for future
# invocations of this RUN layer. Meaning, once this command is run once, all
# successive calls will use the already downloaded and already compiled assets.
RUN --mount=type=cache,target=/go/pkg/mod \
    --mount=type=cache,target=/root/.cache/go-build \
    go build ./server
EN

回答 2

Stack Overflow用户

发布于 2020-07-22 02:19:20

我经常将COPY go.mod放在Dockerfile的开头,因为它不会经常更改。

代码语言:javascript
复制
FROM golang:1.14.3 as builder

WORKDIR /app

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .
RUN go build -tags netgo -ldflags '-extldflags "-static"' -o app .

FROM centos:7  
WORKDIR /root

COPY --from=builder /app/app .

所以,如果你去国防部不改变,行RUN go mod download只运行第一次。

票数 1
EN

Stack Overflow用户

发布于 2020-12-18 14:43:12

如果你跑了去拿吧。/.它将根据go.mod和go.sum将所有依赖项下载到您的坞映像中。如果您正在处理内部自签名存储库,还可以向go get命令添加--不安全标志。非常类似于去模下载。除此之外,您还可以有一个shell脚本来启动Go测试。/.并向您的CI环境报告,如果允许的话,我知道Gitlab允许这样做。

代码语言:javascript
复制
FROM golang:1.15-alpine AS builder
RUN apk add --update git gcc musl-dev
RUN apk update && apk add bash
COPY . /app
RUN go version

WORKDIR /app
ENV CGO_ENABLED=0
RUN git config --global http.sslVerify false
RUN go get ./...

WORKDIR /app
RUN chmod +x ./unitTest.sh
RUN ./unitTest.sh

WORKDIR /app/cmd/svr
RUN go build -o app
RUN chmod 700 app

FROM alpine:latest
WORKDIR /root/
ARG build_stamp
ARG git_commit
ARG build_number
ENV BUILD_STAMP=$build_stamp
ENV GIT_COMMIT=$git_commit
ENV BUILD_NUMBER=$build_number
COPY --from=builder /app/cmd/svr .
EXPOSE 8000
CMD ["./app"]

还有剧本

代码语言:javascript
复制
#!/usr/bin/env bash

TESTS=$(go test -v -covermode=count -coverprofile=count.txt ./...)
echo "$TESTS"

if echo "$TESTS" | grep -q "FAIL" ; then
  echo ""
  echo "One or more Unit Tests for app have Failed. Build will now fail. Pipeline will also fail..."
  echo ""
  exit 1
else
  echo ""
  echo "All Unit Tests for application have passed!"
  echo "Running Code Coverage..."
  echo ""
  COVERAGE=$(go tool cover -func=./count.txt)
  echo "$COVERAGE"
  exit 0
fi
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60200363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档