如何使用 podman 的 ssh 构建标志?

Rua*_*ien 6 ssh ssh-keys buildah podman

我一直在使用docker 构建--ssh标志来让构建从 ssh-agent 访问我的密钥。

\n

当我用 podman 尝试同样的事情时,它不起作用。我正在 macOS Monterey 12.0.1 上工作。英特尔芯片。我还在 Ubuntu 和 WSL2 上重现了这个。

\n
\xe2\x9d\xaf podman --version\npodman version 3.4.4\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个 Dockerfile 示例:

\n
FROM python:3.10\n\nRUN mkdir -p -m 0600 ~/.ssh \\\n    && ssh-keyscan github.com >> ~/.ssh/known_hosts\n\nRUN --mount=type=ssh git clone git@github.com:ruarfff/a-private-repo-of-mine.git\n\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行DOCKER_BUILDKIT=1 docker build --ssh default .它时,它可以工作,即构建成功,存储库被克隆,并且 ssh 密钥没有烘焙到图像中。

\n

当我运行podman build --ssh default .构建失败时:

\n
git@github.com: Permission denied (publickey).\nfatal: Could not read from remote repository.\n\nPlease make sure you have the correct access rights\nand the repository exists.\nError: error building at STEP "RUN --mount=type=ssh git clone git@github.com:ruarfff/a-private-repo-of-mine.git": error while running runtime: exit status 128\n
Run Code Online (Sandbox Code Playgroud)\n

我刚刚开始玩 podman。查看文档,该标志似乎确实受支持。我尝试过稍微修改一下格式,例如直接指定 id,但到目前为止,指定标志或安装的任何变化都没有起作用。有没有关于 podman 工作原理的东西我可能会错过来解释这一点?

\n

按照评论中的建议添加这一行:

\n
RUN --mount=type=ssh ssh-add -l \n
Run Code Online (Sandbox Code Playgroud)\n

结果出现此错误:

\n
STEP 4/5: RUN --mount=type=ssh ssh-add -l \nCould not open a connection to your authentication agent.\nError: error building at STEP "RUN --mount=type=ssh ssh-add -l": error while running runtime: exit status 2\n
Run Code Online (Sandbox Code Playgroud)\n

编辑:

\n

我相信这可能与buildah 中的这个问题有关。修复已合并,但据我所知尚未发布。

\n

amn*_*amn 1

error while running runtime: exit status 2消息似乎不一定与 SSH 或--sshfor相关podman build,至少对我来说不是。诚然,很难确定,而且我已经成功地使用了--ssh像您尝试做的那样,但有一些细微的差异,我无法将其与错误联系起来。

我也不确定ssh-add作为构建容器的一部分运行是你真正想要做的——如果你希望它与代理对话,你需要从运行的环境中导出两个环境变量ssh-add,这些定义在哪里找到与之交谈的代理,如下所示:

  • SSH_AUTH_SOCK,指定程序用于与代理通信的套接字文件的路径
  • SSH_AGENT_PID,指定代理的PID

同样,如果导出的环境变量集中没有这两个变量,代理就无法被发现,并且可能根本不存在,因此ssh-add会失败。

由于您的代理可能作为您podman build所属的进程集的一部分运行,因此至少 表示的 PID在该命名空间中SSH_AGENT_PID应该有效(这意味着它通常在容器构建所隔离的进程集中无效,因此将变量定义为构建容器的一部分将是一个错误)。类似的故事- 通过启动代理程序转储的套接字文件的路径通常不会引用正在构建的容器的安装命名空间中存在的文件。SSH_AUTH_SOCK

现在,您可以运行代理并ssh-add作为构建容器的一部分,但是ssh-add从中读取密钥,如果您有密钥文件作为正在构建的容器映像的一部分,那么您一开始~/.ssh就不需要,不是吗?--ssh

其价值在于,允许您将与通过主机上的--ssh密钥定义的远程服务进行通信的权限转移到其他非常隔离的容器构建过程,只使用专门为此目的设计的 SSH 代理即可。这样就无需执行将密钥文件复制到容器中之类的操作。它们(钥匙)通常也不应该是已构建容器的一部分,特别是如果它们仅在构建期间使用。另一方面,代理在主机上运行,​​安全地封装您添加到其中的密钥,并且由于主机是您拥有密钥的地方,因此您应该在主机上运行以将它们添加到代理中。ssh-add