2 回答

TA貢獻1798條經驗 獲得超3個贊
編輯:
驗證您在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 密鑰(永遠不要將密鑰簽入倉庫?。?/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"]

TA貢獻1818條經驗 獲得超8個贊
這里有兩個問題需要解決:
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.更新Dockerfile
4.1。確保 Git 使用 SSH 而不是 HTTPS
Go 傾向于通過HTTPs
. git
您可以通過更新配置來調整此行為:
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 .
- 2 回答
- 0 關注
- 228 瀏覽
添加回答
舉報