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

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

在 Docker 中使用私有 gitlab 模塊構建 Go 應用程序

在 Docker 中使用私有 gitlab 模塊構建 Go 應用程序

Go
陪伴而非守候 2022-08-01 17:16:59
我正在嘗試在 docker 文件上構建我的 go 應用程序。在我的go.mod中,有一個需要身份驗證/ ssh的私有包。這個問題類似于在Docker中使用私有模塊構建Go應用程序,但在我的情況下,我必須從中提取包而不是從中提取包。這是我的 dockerfile:gitlabgithub# builder imageFROM golang:1.14.11-alpine AS builder# specific directory for build processWORKDIR /usr/src/build# copying the source code # to the current working directoryCOPY . .RUN apk add --no-cache openssh-clientRUN apk add --no-cache git# create ssh directoryRUN mkdir ~/.sshRUN touch ~/.ssh/known_hostsRUN ssh-keyscan -t rsa gitlab.com >> ~/.ssh/known_hosts# allow private repo pullRUN git config --global url."https://my-personal-access-token:[email protected]/".insteadOf "https://gitlab.com/"ADD . /go/src/gitlab.com/my-repo/backends/backend-structsCMD cd /go/src/gitlab.com/my-repo/backends/backend-structs; go get /go/src/gitlab.com/my-repo/backends/backend-structs && go build -o /go/bin/backend-structs# executing build processRUN GOOS=linux go build -ldflags="-s -w" -o app# runtime imageFROM golang:1.14.11-alpine AS runtime# create and use non-root user# to increase container security # ref https://pythonspeed.com/articles/root-capabilities-docker-security/RUN adduser myuser --disabled-passwordUSER myuserWORKDIR /home/myuser# copy the executable binary file from builder directory# to the current working directoryCOPY --from=builder /usr/src/build/app .# exposing portEXPOSE 8080# run the applicationCMD ["./app"]我試圖按照本教程 https://divan.dev/posts/go_get_private/,通過更改為仍然失敗。github.comgitlab.com以下是錯誤詳細信息:#17 5.830       remote: HTTP Basic: Access denied#17 5.830       fatal: Authentication failed for 'https://gitlab.com/my-repo/backends.git/'------executor failed running [/bin/sh -c GOOS=linux go build -ldflags="-s -w" -o app]: exit code: 1這里有人知道如何用golang私有包創建dockerfile(repo托管在 gitlab.com 中)?
查看完整描述

2 回答

?
慕婉清6462132

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


查看完整回答
反對 回復 2022-08-01
?
慕妹3242003

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


查看完整回答
反對 回復 2022-08-01
  • 2 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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