docker build 命令使用 ssh url 到 git repo:权限被拒绝

Posted

技术标签:

【中文标题】docker build 命令使用 ssh url 到 git repo:权限被拒绝【英文标题】:docker build command using ssh url to git repo: Permission denied 【发布时间】:2021-11-11 06:05:14 【问题描述】:

我正在尝试制作一个脚本来构建一堆 docker 镜像并将它们推送到一个私有存储库。

从documentation 来看,docker build 命令似乎接受了 git url:确实非常好。

所有存储库都是私有的,公司中的每个人都设置了 ssh 密钥以通过 ssh 访问 git 存储库,例如 git clone git@github.com:/my-org/my-repo.git

我认为提供这样的 url 会很好用,因为它似乎是一个非常常见的用例。事实证明不是。

我搜索了一个解决方案并找到了git ticket about url formatting,所以我尝试了以下所有方法:

ssh://git@github.com:/my-org/my-repo.git ssh://git@github.com/my-org/my-repo.git ssh://git@github.com:my-org/my-repo.git git@github.com:/my-org/my-repo.git git@github.com/my-org/my-repo.git git@github.com:my-org/my-repo.git

这个列表中的最后一个是最有希望的,因为我得到了以下输出:

$ docker build -t registry.example.com:5000/my-repo:latest --ssh=default git@github.com:my-org/my-repo.git

[+] Building 0.9s (1/1) FINISHED                                                                                                                                                             
 => ERROR [internal] load git source git@github.com:my-org/my-repo.git                                                                                                     0.9s
------                                                                                                                                                                                       
 > [internal] load git source git@github.com:my-org/my-repo.git:                                                                                                                
#1 0.551 Warning: Permanently added the RSA host key for IP address '140.82.121.3' to the list of known hosts.
#1 0.896 git@github.com: Permission denied (publickey).
#1 0.898 fatal: Could not read from remote repository.
#1 0.898 
#1 0.898 Please make sure you have the correct access rights
#1 0.898 and the repository exists.
------
failed to solve with frontend dockerfile.v0: failed to read dockerfile: failed to load cache key: failed to fetch remote git@github.com:my-org/my-repo.git: exit status 128

在有人问之前:是的,repo 存在,我可以克隆它:)

我假设该过程的“克隆”部分将使用我自己的 ssh 密钥在“本地”完成,然后再将上下文发送给 docker 构建。显然不是这样的。

它是受支持的功能吗?如果支持,如何使其工作?


编辑:我意识到我忘了提供一些背景信息。

我在 macOS big sur 上运行 Docker Desktop

Docker version 20.10.8, build 3967b7d

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)
  compose: Docker Compose (Docker Inc., v2.0.0-rc.3)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
 Containers: 9
  Running: 8
  Paused: 0
  Stopped: 1
 Images: 28
 Server Version: 20.10.8
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: e25210fe30a0a703442421b0f60afac609f950a3
 runc version: v1.0.1-0-g4144b63
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.47-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 3.842GiB
 Name: docker-desktop
 ID: 77LC:Z2AY:K6AA:OXAY:3JYQ:RSSL:RCJZ:GOSK:FUTG:DAPY:WIKK:BB7A
 Docker Root Dir: /var/lib/docker
 Debug Mode: true
  File Descriptors: 105
  Goroutines: 93
  System Time: 2021-09-16T08:47:27.924652162Z
  EventsListeners: 4
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  <REDACTED>
 Live Restore Enabled: false

【问题讨论】:

【参考方案1】:

Docker for Mac 不会在您的机器上本地运行,而是在 VirtualMachine 中运行。看起来git clone 命令是在 VirtualMachine 内部执行的

我的假设是基于此日志条目: #1 0.551 Warning: Permanently added the RSA host key for IP address '140.82.121.3' to the list of known hosts.

因此,为了通过 ssh 访问您的私有存储库,您还需要将 ssh 密钥对存储在 Docker 的 VirtualMachine 中。

EDIT 要连接到 VirtualMachine,请打开终端并运行 docker run -it --privileged --pid=host justincormack/nsenter1

【讨论】:

是的,我知道它在 mac 上运行一个 vm,但我从来没有机会真正深入了解这个 vm。我什至不知道这是否可能......关于我将如何做到这一点的任何线索? 从这个帖子***.com/questions/39739560/…找到这个命令docker run -it --privileged --pid=host justincormack/nsenter1【参考方案2】:

当您设置--ssh=default 时,您的 SSH 密钥是否已添加到正在转发的 ssh-agent 中?要检查运行ssh-add -l,如果它没有显示您的密钥,然后添加类似ssh-add -k ~/.ssh/id_rsa

【讨论】:

它通常有效。我实际上不需要 ssh inside 构建器。 --ssh 的事情更像是绝望地尝试将我的信誉转发给 docker,但没有成功

以上是关于docker build 命令使用 ssh url 到 git repo:权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

docker build 命令

Docker命令详解(build篇)

Docker命令之 build

42-Docker-Docker命令详解-docker build

docker 命令详解(二十九):build

如何从 docker 容器通过 ssh 传输 TCP 流量?