如何调试因 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 ...
同样在文件中,mkdir
是 600
。 700
或 600
相同的区别。
所以我的问题是:在知道容器消失并且设置根本不想工作的情况下如何调试 SSH 问题?
我在许多答案和文档中找到了很多信息,但它仍然不起作用,并且根本没有关于如何在失败时真正调试此类设置的信息。
- Using SSH keys inside docker container
- Is it possible to start a shell session in a running container (without ssh)
- docker buildkit mount ssh when using remote agent forwarding
- Using SSH to Access Private Data in Builds
- docker build
$ 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
和其他设置的更多详细信息,请参阅
我在使用 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 ...
同样在文件中,mkdir
是 600
。 700
或 600
相同的区别。
所以我的问题是:在知道容器消失并且设置根本不想工作的情况下如何调试 SSH 问题?
我在许多答案和文档中找到了很多信息,但它仍然不起作用,并且根本没有关于如何在失败时真正调试此类设置的信息。
- Using SSH keys inside docker container
- Is it possible to start a shell session in a running container (without ssh)
- docker buildkit mount ssh when using remote agent forwarding
- Using SSH to Access Private Data in Builds
- docker build
$ 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
和其他设置的更多详细信息,请参阅