Go mod未知修订版

时间:2020-07-27 17:39:46

标签: docker go

在构建Docker容器中的go app时遇到此错误。 我的供应商目录中包含所有必需的软件包。 此错误持续存在于go 1.13+ 1.12正常工作。 我什至在我们的私有仓库中添加了ssh密钥,并且git clone命令也很好。 标签存在。 这是错误go: XXX/YYY@vTAG: reading XXX/YYY/go.mod at revision v0.0.7: unknown revision vTAG

有人遇到此错误吗? 谢谢

2 个答案:

答案 0 :(得分:1)

这里有两个问题需要解决:

1.如何让 Docker 安全地访问本地 SSH 密钥?

2.如何告诉 Go 不使用公共注册表来获取私有包?


简短回答

  1. Docker v18.09 起,有一个内置解决方案可在构建阶段 (more) 处理 SSH 身份验证。与传递构建参数相比,它也更容易、更安全,并且无需多阶段 Docker 构建。

  2. Go 有一个 GOPRIVATE 环境变量来标识私有包。 (more)


长答案

分步说明:

1.确保 ssh-agent 已设置并知道 SSH 密钥

Github 有一个关于这个主题的快速指南,解释了不同操作系统的过程。见Generating a new SSH key and adding it to SSH agent

2.为 Docker 启用 BuildKit

如果没有 BuildKitdocker build 将无法识别 --ssh 选项。

来自Docker reference

<块引用>

全新安装 docker 的最简单方法是设置 DOCKER_BUILDKIT=1 调用 docker build 时的环境变量 命令,例如:

$ DOCKER_BUILDKIT=1 docker build .

通过以下方式启用 docker BuildKit 默认,在 /etc/docker/daemon.json 功能中设置守护程序配置 为真并重新启动守护进程:

{ "features": { "buildkit": true } }

Docker Desktop 用户可以通过 Preferences > Docker Engine 管理守护进程配置。

4.更新 Dockerfile

4.1.确保 Git 使用 SSH 而不是 HTTPS

Go 倾向于通过 HTTPs 获取公共包。您可以通过更新 git 配置来调整此行为:

RUN git config --global url.git@github.com:.insteadOf https://github.com/

您可能也应该在本地计算机上执行此操作。

4.2.在需要的地方请求 SSH 访问

每个需要 SSH 访问的 RUN 命令都应该用 type=ssh 挂载。对于

示例:

RUN --mount=type=ssh git clone ...

4.3.确保 Go 知道您的私人包裹

更新 GOPRIVATE 变量:

RUN go env -w GOPRIVATE="github.com/your-org/private-repo"

将所有内容放在一起,在以下 Dockerfile 示例中:

FROM golang:1.16.3-alpine3.13
RUN apk update
RUN apk add git openssh
RUN mkdir /app
ADD . /app
WORKDIR /app

# You can replace github.com with any other Git host
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Make sure git uses SSH to fetch packages, not HTTPs
RUN git config --global url.git@github.com:.insteadOf https://github.com/

# Make Go knows which packages are private.
RUN go env -w GOPRIVATE="github.com/your-org/private-repo"
# GOPRIVATE is a comma separated list glob-patterns.
# You can use a wildcard to match every repo in an organization:
#   e.g.: GOPRIVATE="github.com/your-org/*"

# Mount the build command with type `ssh`.
RUN --mount=type=ssh go get && go build -o main .

CMD ["/app/main"]

6.使用 --ssh 选项构建映像:

默认启用 BuildKit:

$ docker build --ssh default -t my-app:latest .

答案 1 :(得分:0)

编辑:

bitbucket.org中验证您的远程存储库是否确实具有您要针对其构建的v0.0.7标签。

如果git标签在本地存在,则本地构建可能会工作-docker构建将从远程源中拉出,并失败,并显示诸如go.mod at revision v0.0.7: unknown revision v0.0.7之类的错误-如果该标签不存在远程

enter image description here

要将您的本地标签推送到远程仓库中,

git push --tags

有关更精细的标记操作see


默认情况下,Docker构建只能访问公共存储库。由于您需要访问私有存储库,因此需要在 Docker 构建过程中包括一个read-ssh密钥(密钥永远都不应签入存储库!)。

这是 至关重要的 ,但是,您在multi-stage build中执行此操作,因此,不要在最终映像中包含SSH密钥。

blog post遍历所有步骤。但要包括一个可行的示例:

要构建docker映像:

SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" \
    docker build -t "myapp:v0.0.1" --build-arg SSH_PRIVATE_KEY .

然后使用Dockerfile专用回购网站的bitbucket.org

FROM golang:1.14.6 AS build
  
WORKDIR /bld
COPY *.go go.mod go.sum ./

ARG SSH_PRIVATE_KEY
# ***NEVER*** DO THIS IN A SINGLE-STAGE DOCKER BUILD (see below)
RUN \
        mkdir -p ~/.ssh && \
        umask 0077 && \
        echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa && \
        git config --global url."git@bitbucket.org:".insteadOf https://bitbucket.org/ && \
        ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts

RUN \
        go get && \
        CGO_ENABLED=0 go build -o app

# final stage of multi-stage: will appropriately *NOT* include SSH keys
FROM scratch

COPY --from=build \
        /etc/ssl /etc/ssl

COPY --from=build \
    /bld/app /app/myapp

CMD ["/app/myapp"]