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

How do I debug a "docker build ..." session that errs on the github key not being available?

我在使用 docker build ... 命令时遇到问题,该命令在尝试从私有 git 克隆存储库时中断。错误信息说我没有权限:

#17 4.712 go: github.com/private/project@v1.0.0: reading github.com/private/project/go.mod at revision v1.0.0: git ls-remote -q origin in /go/pkg/mod/cache/vcs/<big-id>: exit status 128:
#17 4.712 git@github.com: Permission denied (publickey).
#17 4.712 fatal: Could not read from remote repository.
#17 4.712
#17 4.712 Please make sure you have the correct access rights
#17 4.712 and the repository exists.
------
executor failed running [/bin/sh -c cd cmd/service/ && go build -o service]: 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 ... 失败并出现上述错误。

另外,--rm=false 由于 export DOCKER_BUILDKIT=1 而无效。所以我不知道如何调试它。我看不到任何容器,一旦 docker 命令 returns...

,它们就会被销毁

我尝试改变 --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 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 输出是 neat 和 all,但是它给你一行彩色信息并且没有任何关于你的 运行 命令中发生的事情的细节,除非发生错误(最后打印的错误)。

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

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,

WARNING 1: This line is likely to disappear whenever the docker gets updated.

WARNING 2: You want to run the following command so the changes take effect immediately (or reboot):

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

我还对 /run/user/1000/run/user/keyring 文件夹做了 chmod。一旦我让事情真正起作用,我会尽量不进行那些 chmod 更改...但我不会抱太大希望。

好的,我有事情要做!

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

有关 Dockerfile 和其他设置的更多详细信息,请参阅