亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法成功構建基于 Go 的 Docker 映像

無法成功構建基于 Go 的 Docker 映像

Go
江戶川亂折騰 2022-06-21 10:22:22
嘗試構建基于 GoLang 的 Docker 映像時,Docker 執行器遇到以下錯誤:. . .go: [email protected]: 在版本 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- 如果標簽不存在遠程

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

要將本地標簽推送到遠程倉庫:


git push --tags

有關更精細的標記操作,請參閱。


默認情況下,Docker 構建只能訪問公共存儲庫。由于您需要訪問私有倉庫,因此您需要在Docker構建過程中包含一個 read-ssh 密鑰(永遠不要將密鑰簽入倉庫?。?/p>


然而,這是非常重要的,您在多階段構建中執行此操作,因此您不會在最終映像中包含您的 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."[email protected]:".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

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

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

Go 傾向于通過HTTPsgit您可以通過更新配置來調整此行為:

RUN git config --global [email protected]:.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 [email protected]:.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 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號