2 回答

TA貢獻1804條經驗 獲得超2個贊
根據我的經驗,不要使用git配置來解決這個問題。僅使用 .以下是專門為此制作的指南:https://gist.github.com/MicahParks/1ba2b19c39d1e5fccc3e892837b10e21~/.netrc
我也會將其內容粘貼在下面。
問題
命令行工具需要能夠從私有 GitLab 獲取依賴項,但需要身份驗證。go
這假設您的私有 GitLab 托管在 。privategitlab.company.com
環境變量
建議使用以下環境變量:
export GO111MODULE=on
export GOPRIVATE=privategitlab.company.com
上面的行可能最適合您的 shell 啟動,例如 .~/.bashrc
解釋
GO111MODULE=on告訴Golang命令行工具您正在使用模塊。我還沒有在私有GitLab上不使用Golang模塊的項目上對此進行測試。
GOPRIVATE=privategitlab.company.com告訴Golang命令行工具不要對列出的主機名(如公共模塊代理)使用公共互聯網資源。
從您的私有 GitLab 獲取個人訪問令牌
為了將來證明這些說明,請按照 GitLab 文檔中的本指南進行操作。我知道Golang命令行工具需要該范圍才能工作,我可能也懷疑,但尚未確認這一點。read_apiread_repository
設置~/.netrc
為了使 Golang 命令行工具能夠向 GitLab 進行身份驗證,最好使用一個文件。~/.netrc
若要創建該文件(如果該文件不存在),請運行以下命令:
touch ~/.netrc
chmod 600 ~/.netrc
現在編輯文件的內容以匹配以下內容:
machine privategitlab.company.com login USERNAME_HERE password TOKEN_HERE
Where 將替換為您的 GitLab 用戶名,并替換為上一節中獲取的訪問令牌。USERNAME_HERETOKEN_HERE
常見錯誤
不要使用如下內容設置全局 git 配置:
git config --global url."[email protected]:".insteadOf "https://privategitlab.company.com"
我相信在撰寫本文時,Golang命令行工具并不完全支持SSH git,這可能會導致與.~/.netrc
獎勵:SSH 配置文件
對于該工具的常規使用,而不是Golang命令行工具,設置文件很方便。為此,請運行以下命令:git~/.ssh/config
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config
請注意,上述文件和目錄的權限是essentail,以便SSH在大多數Linux系統上以默認配置工作。
然后,編輯該文件以匹配以下內容:~/.ssh/config
Host privategitlab.company.com
Hostname privategitlab.company.com
User USERNAME_HERE
IdentityFile ~/.ssh/id_rsa
請注意,上述文件中的間距很重要,如果文件不正確,將使文件無效。
您的 GitLab 用戶名在哪里,并且是文件系統中 SSH 私鑰的路徑。您已經將其公鑰上傳到GitLab。以下是一些說明。USERNAME_HERE~/.ssh/id_rsa

TA貢獻1824條經驗 獲得超6個贊
我在私有倉庫中遇到了這個問題。我使用作為解決方案,但是,我遇到了困難,因為其他答案中存在各種假設。在我的情況下,我的密鑰文件名有問題,另一個問題是AppArmor。github.comssh-agent
我將在下面詳細討論我的設置和這些問題。
實驗性 Docker 功能
首先,在 中,您希望通過在第一行添加類似這樣的注釋來允許較新的選項:Dockerfile
# syntax=docker/dockerfile:experimental
這將使我們能夠使用該選項。--mount=type=ssh
注意:如果注釋不在第一行,它將被忽略,并且諸如--mount=...之類的擴展名將失敗。
基本設置Dockerfile
像你一樣,我們使用Go alpine。我們還確保獲得.openssh-client
FROM golang:alpine AS build-env
RUN apk --no-cache add build-base git mercurial gcc curl openssh-client
詳細,我們添加我們的代碼(整個文件夾):
ADD . .
創建 & 文件known_hosts.gitconfig
現在我們有一個問題,因為默認情況下,SSH不會識別密鑰。為避免此問題,我們希望將(在您的情況下)密鑰添加到我們的已知主機。我們還希望確保將其與SSH一起使用,而不是與HTTPS一起使用。github.comgitlab.comgithub.com
RUN mkdir -p -m 0700 ~/.ssh && \
ssh-keyscan github.com >> ~/.ssh/known_hosts && \
echo -e "[url \"[email protected]:<company-name>\"]\n\tinsteadOf = https://github.com/<company-name>" >> ~/.gitconfig
注意:此時 docker 中的 ~ 始終是 /root。
有些人附加一個卷,讓 Docker 訪問他們的文件。我不認為這是安全的,如果你運行CircleCI等在線工具,它很可能會崩潰。known_hosts
構建 Go 應用程序
這為我們提供了最終構建應用程序的所有必要元素:
ENV GO111MODULE=on
ENV GOPRIVATE=github.com/<company-name>
RUN --mount=type=ssh cd cmd/app/ && go build -o app
我們的 Dockerfile 還有幾行,這里沒有介紹,用于定義其他文件和最終的 ENTRYPOINT。
加載鍵輸入ssh-agent
我們幾乎準備好運行 .但是我們仍然需要在我們的.這很簡單:docker build ...ssh-agent
ssh-add id_rsa
超級非常重要:密鑰的名稱必須是預期的默認值之一。 就是其中之一。如果您的密鑰名稱不是默認值之一,則不會選取該密鑰。sshid_rsa
以下是在我的一個測試中檢查的名稱。運行命令時會看到這些內容(見下文)。ssh -A -v ...
#18 0.828 debug1: identity file /root/.ssh/id_rsa type -1
#18 0.828 debug1: identity file /root/.ssh/id_rsa-cert type -1
#18 0.828 debug1: identity file /root/.ssh/id_dsa type -1
#18 0.828 debug1: identity file /root/.ssh/id_dsa-cert type -1
#18 0.829 debug1: identity file /root/.ssh/id_ecdsa type -1
#18 0.829 debug1: identity file /root/.ssh/id_ecdsa-cert type -1
#18 0.829 debug1: identity file /root/.ssh/id_ecdsa_sk type -1
#18 0.829 debug1: identity file /root/.ssh/id_ecdsa_sk-cert type -1
#18 0.829 debug1: identity file /root/.ssh/id_ed25519 type -1
#18 0.829 debug1: identity file /root/.ssh/id_ed25519-cert type -1
#18 0.829 debug1: identity file /root/.ssh/id_ed25519_sk type -1
#18 0.829 debug1: identity file /root/.ssh/id_ed25519_sk-cert type -1
#18 0.829 debug1: identity file /root/.ssh/id_xmss type -1
#18 0.829 debug1: identity file /root/.ssh/id_xmss-cert type -1
您可以使用以下命令檢查密鑰是否已加載:
ssh-add -l
每個鍵的名稱應顯示在行的末尾。它必須是上面提到的默認值之一(您也可以擺弄docker文件中的條目)。Host.ssh/config
構建 Docker 映像
為了構建映像,我們現在按如下方式運行:docker
DOCKER_BUILDKIT=1 docker build --progress=plain .
(當然,您可以使用其他選項,例如--build-arg GO_VERSION=...來強制使用golang的一個版本)
這使您能夠更好地了解正在發生的事情。不知何故,它會阻止 Docker 保存中間映像和容器,因此如果沒有該選項,您將無法進行太多調試。--progress=plainDOCKER_BUILDKIT=1
選項--ssh default
可能仍需要此命令行選項。我實際上使用它。但是,在最新版本的 docker 中,如果檢測到(或類似的?),它會自動打開。我不太確定它是否可以在所有情況下檢測到這種情況。如果遇到問題,請確保在命令行中包含該選項。[email protected]... docker build ...
在我的經驗中,沒有必要具體說明任何細節。就足夠了。default
調試 SSH 連接
如果您在連接時遇到問題(即SSH告訴您連接被拒絕),那么您可以在調試之前添加RUN命令以調試該部分:RUN ... go build ...
RUN ssh -A -v -l git github.com
該選項告訴 SSH 使用 檢索私鑰。
要求 SSH 打印出調試信息。
該選項定義用戶名。對于 ,您需要用作用戶名。默認情況下,使用 Docker 內部的 .這是行不通的。-Assh-agent-v-lgithub.comgitssh$USERroot
如果連接有效,則告訴您已獲得授權,但沒有要連接的 shell,因此您立即被踢出。如果您沒有看到該友好消息,則 SSH 尚未正確設置。實際上,您可以在控制臺中測試該連接,如下所示:github.com
$ ssh -l git github.com
PTY allocation request failed on channel 0
Hi <your-name>! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
問題 1:apparmor
所有這些都對我不起作用。事實是,會創建一個隱藏在下方的套接字,并且默認情況下不允許該路徑進入工具和服務。至少,如果你的內核像Ubuntu服務器一樣有apparmor,它就不會起作用。ssh-agent/run/user/<uid>/keyring/sshdocker ...
您可以通過查看您的或類似文件(可能是 )來查看這種情況。將出現“已拒絕”錯誤,如下所示:/var/log/syslog/var/log/auth.log
Oct 28 10:42:13 ubuntu2004 kernel: [78018.511407] audit: type=1400 audit(1635442933.692:143): apparmor=“DENIED” operation=“connect” profile=“snap.docker.docker” name=“/run/user/1000/keyring/ssh” pid=36260 comm=“docker” requested_mask=“wr” denied_mask=“wr” fsuid=1000 ouid=1000
我們看到我的密鑰環套接字的完整路徑,拒絕訪問的apparmor配置文件的名稱,以及操作,這里是“連接”。要解決此問題,您首先需要找到配置文件。這是在 :/var/lib/snapd
/var/lib/snapd/apparmor/profiles/snap.docker.docker
然后運行以下命令:
$ sudo apparmor_parser -r \
/var/lib/snapd/apparmor/profiles/snap.docker.docker
以刷新 apparmor 設置。
如果您不使用Docker的快照版本,則配置文件通常位于下,但我無法在較新版本的Docker(2021)中看到該文件.../etc/apparmor.d/...
編輯該文件,轉到末尾,然后在結束字符之前,輸入以下行:}
/run/user/1000/keyring/ssh rw,
這意味著將能夠讀取和寫入此特定套接字。docker
顯然,這是一個特定的用戶。如果不是您,請使用您的用戶 ID () 或要運行的用戶標識符。1000id -udocker build ...
您也可以允許該計算機上的所有用戶,但不建議這樣做:
/run/user/[0-9]*/keyring/ssh rw,
(它仍然非常安全,因為你只給docker權限,但你永遠不會知道...)
問題 2:密鑰文件名
我在這里重復第二個問題,因為這非常重要。來自 Docker 的密鑰查找將搜索一個名為 (和其他類似的默認密鑰名稱,見上文)的密鑰。如果你為密鑰使用特殊名稱,比如說 ,那么 Docker 不會選取它。id_rsagithub_rsa
您可以通過添加以下內容來將該文件用于此目的:.ssh/config
Host github.com
IdentityFile /root/.ssh/github_rsa
在某個時候,我擺弄了這樣,但無法使它工作??赡苁且驗閱栴}#1(又名apparmor)。但是,如果您要與許多程序員共享您的名稱,則需要很好地記錄以這種方式使用特殊名稱。大多數程序員不做這樣的事情,他們可能需要一段時間才能找出為什么他們不能在他們的系統上創建Docker映像。Dockerfile
什么都不做!chmod
在許多頁面/答案中,您會看到權限通常使用命令進行解析。例如,如果有人認為 Docker 無法訪問他們的密鑰,因為其文件夾上的權限為 700 (rwx-----) 或文件的權限為 600 (rw-------),則可能認為更改這些權限會有所幫助。它不會。中的條目足以根據需要共享您的私鑰。chmod/run/user/1000~/.ssh/...ssh-agent
關于使用的附注.netrc
據我所知,當您使用 時,您會在 Docker 映像中包含您的憑據。這意味著任何獲得圖像副本的人都有您的憑據??赡懿皇悄阆胍臇|西。如果您的圖像僅在內部使用,則可能沒問題....netrc
- 2 回答
- 0 關注
- 139 瀏覽
添加回答
舉報