猿问

无法成功构建基于 Go 的 Docker 映像

尝试构建基于 GoLang 的 Docker 映像时,Docker 执行器遇到以下错误:

. . .go: $GIT_REPO@v1.9.11: 在版本 v0.0.07 读取 $GIT_REPO/go.mod: 未知版本 v0.0.07

按照使用的以下RUN说明Dockerfile

RUN go build . . .

其中GIT_REPO代表私人回购。完整路径,包括所有者和名称。

Docker 执行器遇到此错误go1.13.x及更高版本;Docker 执行程序不会遇到此错误go1.12.x

供应商目录。包含所有必需的软件包。标签被确认存在。

甚至将正确的 SSH 密钥添加到私有 Go 通用存储库中。与成功

git clone . . .

在 Docker 映像之外执行命令build,但仍然遇到上述相同的错误。


江户川乱折腾
浏览 242回答 2
2回答

呼如林

编辑:验证您在bitbucket.org中的远程存储库是否确实具有v0.0.7您尝试构建的标签。如果 git 标签在本地存在,则本地构建可能会工作 - docker 构建将从远程源中提取并失败并出现错误,例如go.mod at revision v0.0.7: unknown revision v0.0.7- 如果标签不存在远程。要将本地标签推送到远程仓库:git push --tags有关更精细的标记操作,请参阅。默认情况下,Docker 构建只能访问公共存储库。由于您需要访问私有仓库,因此您需要在Docker构建过程中包含一个 read-ssh 密钥(永远不要将密钥签入仓库!)。然而,这是非常重要的,您在多阶段构建中执行此操作,因此您不会在最终映像中包含您的 SSH 密钥。这篇博文介绍了所有步骤。但要包括一个工作示例:构建 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 /bldCOPY *.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_hostsRUN \        go get && \        CGO_ENABLED=0 go build -o app# final stage of multi-stage: will appropriately *NOT* include SSH keysFROM scratchCOPY --from=build \        /etc/ssl /etc/sslCOPY --from=build \    /bld/app /app/myappCMD ["/app/myapp"]

弑天下

这里有两个问题需要解决:1. 如何让 Docker 安全地访问本地 SSH 密钥?2. 如何告诉 Go 不要使用公共注册表来获取私有包?简短的答案从Docker v18.09 开始,有一个内置的解决方案可以在构建阶段处理 SSH 身份验证(更多)。与传递构建参数相比,它也更容易、更安全,并且无需多阶段 Docker 构建。Go 有一个GOPRIVATE环境变量来识别私有包。(更多)长答案一步步:1. 确保ssh-agent已设置并知道 SSH 密钥Github 有一个关于这个主题的快速指南,解释了不同操作系统的过程。请参阅生成新的 SSH 密钥并将其添加到 SSH 代理。2. 为 Docker 启用 BuildKit没有BuildKit,docker build将无法识别--ssh选项。来自Docker 参考:全新安装 docker 最简单的方法是 DOCKER_BUILDKIT=1在调用 docker build 命令时设置环境变量,例如:$ DOCKER_BUILDKIT=1 docker build .要默认启用 docker BuildKit,请将功能中的守护进程配置设置/etc/docker/daemon.json为 true 并重新启动守护进程:{ "features": { "buildkit": true } }Docker Desktop 用户可以通过Preferences > Docker Engine管理守护进程配置。4.更新Dockerfile4.1。确保 Git 使用 SSH 而不是 HTTPSGo 倾向于通过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.13RUN apk updateRUN apk add git opensshRUN mkdir /appADD . /appWORKDIR /app# You can replace github.com with any other Git hostRUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts# Make sure git uses SSH to fetch packages, not HTTPsRUN 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 .
随时随地看视频慕课网APP

相关分类

Go
我要回答