我有一个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:无法读取远程存储库。
#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 ...
同样在文件中,mkdir
是600
。700
或600
相同的差异。
所以我的问题是:我如何调试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应用