为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
江户川乱折腾 2022-06-21 10:22:22
尝试构建基于 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,但仍然遇到上述相同的错误。
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

编辑:

验证您在bitbucket.org中的远程存储库是否确实具有v0.0.7您尝试构建的标签。

如果 git 标签在本地存在,则本地构建可能会工作 - docker 构建将从远程源中提取并失败并出现错误,例如go.mod at revision v0.0.7: unknown revision v0.0.7- 如果标签不存在远程

//img1.sycdn.imooc.com//62b12b7a0001a0ac04360304.jpg

要将本地标签推送到远程仓库:


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 /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"]


查看完整回答
反对 回复 2022-06-21
?
弑天下

TA贡献1818条经验 获得超8个赞

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

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

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


简短的答案

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

  2. Go 有一个GOPRIVATE环境变量来识别私有包。(更多


长答案

一步步:

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

Github 有一个关于这个主题的快速指南,解释了不同操作系统的过程。请参阅生成新的 SSH 密钥并将其添加到 SSH 代理

2. 为 Docker 启用 BuildKit

没有BuildKitdocker 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.更新Dockerfile

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

Go 倾向于通过HTTPsgit您可以通过更新配置来调整此行为:

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 .


查看完整回答
反对 回复 2022-06-21
  • 2 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号