如何调试在 github 键上出错的 "docker build ..." 会话不可用?



我有一个docker build ...命令的问题,当它试图从私有git克隆一个存储库时,它会中断。错误信息说我没有权限:

#17 4.712 go: github.com/private/project@v1.0.0: readinggithub.com/private/project/go.modat revision v1.0.0:git ls-remote -q originin/go/pkg/mod/cache/vcs/<big-id>: exit status 128:
#17 4.712 git@github.com: Permission denied (publickey)。
#17 4.712 fatal:无法读取远程存储库。
#17 4.712
#17 4.712请确保您有正确的访问权限
#17 4.712并且存储库存在。
------
executor failed running [/bin/sh -c CD cmd/service/&&[/p]: exit code: 1

我有所有我认为重要的点

# syntax=docker/dockerfile:experimental
FROM golang:alpine AS build-env
RUN apk add build-base git openssh-client
RUN mkdir -p -m 700 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject
...

然后我用包含--ssh

的命令运行构建
export DOCKER_BUILDKIT=1
docker build --rm=false --no-cache --ssh default --file ./Dockerfile 
--build-arg GO_VERSION=1.16.3 --tag app:main .

git clone ...失败,出现上述错误。

由于export DOCKER_BUILDKIT=1的存在,--rm=false也没有作用。所以我不知道如何调试它。我看不到任何容器,只要docker命令返回,它们就会被销毁…

我试着改变--ssh,以防万一:

# The following gives me a permission error (as I expected)
... --ssh default=/home/alexis/.ssh/id_rsa ...
# The following is, I think, what happens by default, same git error
# (I verified the socket is under /run/user/1000/keyring/ssh
# as defined in the variable)
... --ssh github=$SSH_AUTH_SOCK ...

同样在文件中,mkdir600700600相同的差异。

所以我的问题是:我如何调试SSH问题知道容器消失和设置不想工作吗?

我在很多答案和文档中找到了很多信息,但它仍然不起作用,当它失败时,如何真正调试这样的设置也没有太多的信息。

  • 在docker容器中使用SSH密钥
  • 是否可以在运行的容器中启动shell会话(没有ssh)
  • docker buildkit在使用远程代理转发时挂载ssh
  • 使用Docker Compose将host's的SSH密钥注入Docker机器
  • 在构建中使用SSH访问私有数据
  • 码头工人建立

$ docker version
Client:
Version:           20.10.8
API version:       1.41
Go version:        go1.16.6
Git commit:        3967b7d28e
Built:             Wed Aug  4 21:24:10 2021
OS/Arch:           linux/amd64
Context:           default
Experimental:      true
Server:
Engine:
Version:          20.10.8
API version:      1.41 (minimum version 1.12)
Go version:       go1.16.6
Git commit:       75249d8
Built:            Wed Aug  4 21:26:30 2021
OS/Arch:          linux/amd64
Experimental:     false
containerd:
Version:          v1.4.9
GitCommit:        e25210fe30a0a703442421b0f60afac609f950a3
runc:
Version:          1.0.1
GitCommit:        
docker-init:
Version:          0.19.0
GitCommit:        de40ad0

好了,我终于找到了一个非常有用的选择。默认的docker输出是,但是它只给您一行彩色信息,并且没有详细说明RUN命令中发生了什么,除非发生错误(错误在最后打印出来)。

为了调试,您至少可以使用以下命令获得每个命令的输出:

docker build --progress=plain ...

整齐的输出将被替换为包含错误和标准输出的完整行集。现在我可以添加如下内容:

RUN echo "Hello"

或测试,如:

RUN ssh -A -l git -v github.com

并得到完整的输出。

中间图片&集装箱仍然无处可寻……但是有输出的帮助很大。

作为附带说明,我发现的一件事是--ssh default需要访问您的ssh-agent套接字,默认情况下这是由apparmor保护的。我必须编辑apparmor文件并添加以下内容:

/run/user/1000/keyring/ssh rw,

警告1:当docker更新时,这一行可能会消失。

警告2:您希望运行以下命令,以便更改立即生效(或重新启动):

sudo apparmor_parser -r /var/lib/snapd/apparmor/profiles/snap.docker.docker

我也做了chmod/run/user/1000/run/user/keyring文件夹。一旦我得到的东西实际工作,我会尽量不要有那些chmod的变化…但我不抱太大希望。

好了,我还有事要做!

下一个问题是密钥的名称必须是id_rsa。这是因为docker创建了一个root用户,而这个用户只有默认的密钥名。您可以创建一个具有不同名称的.ssh/config文件。但是,如果您与不使用没有此名称的密钥的其他人一起工作,则可能会出现问题。

关于Dockerfile和其他设置的详细信息,请参见在Docker中使用私有gitlab模块构建Go应用

最新更新