在构建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
有人遇到此错误吗? 谢谢
答案 0 :(得分:1)
这里有两个问题需要解决:
1.如何让 Docker 安全地访问本地 SSH 密钥?
2.如何告诉 Go 不使用公共注册表来获取私有包?
自 Docker v18.09 起,有一个内置解决方案可在构建阶段 (more) 处理 SSH 身份验证。与传递构建参数相比,它也更容易、更安全,并且无需多阶段 Docker 构建。
Go 有一个 GOPRIVATE
环境变量来标识私有包。 (more)
分步说明:
1.确保 ssh-agent
已设置并知道 SSH 密钥
Github 有一个关于这个主题的快速指南,解释了不同操作系统的过程。见Generating a new SSH key and adding it to SSH agent。
2.为 Docker 启用 BuildKit
如果没有 BuildKit,docker build
将无法识别 --ssh
选项。
全新安装 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
之类的错误-如果该标签不存在远程。
要将您的本地标签推送到远程仓库中,
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"]