我正在创建一个podman镜像,我试图了解如何允许容器使用我的主机(Fedora 37)ssh-agent,以便容器可以克隆git仓库。我宁愿这样做,而不是使用PAT或其他我能想到的解决方案。
我举了一个非常简单的例子:
- 应用程序 *
foo
:
#!/bin/bash -eux
git clone "$REPO"
Dockerfile
:
FROM docker.io/fedora:39@sha256:531209ee9007c2bf909c6548b0456524bde9da0a1ac95ecc67bf3b98e9046969
ARG HOST
RUN dnf install -yq git
WORKDIR /app
COPY foo foo
ENV PATH="${PATH}:/app"
RUN useradd -m user && mkdir -p /home/user/.ssh && chown -R user:user /home/user/.ssh
WORKDIR /home/user
RUN printf "Host $HOST\n\tStrictHostKeyChecking no\n" >> .ssh/config
USER user
ENTRYPOINT ["foo"]
然后我创建图像:
podman build -t foo --build-arg HOST=$HOST .
并尝试运行它:
$ podman run -it -v $SSH_AUTH_SOCK:$SSH_AUTH_SOCK:Z -e SSH_AUTH_SOCK=$SSH_AUTH_SOCK -eREPO=$REPO foo
+ git clone git@*********.git
...
*****: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
如果我用--entrypoint /bin/bash
运行容器并执行ssh-add -L
,我会得到:
[user@42e1646bd254 ~]$ ssh-add -L
Could not open a connection to your authentication agent.
我注意到容器中的“$SSH_AUTH_SOCK”目录由root所有:
[user@246199390bfe ~]$ stat $SSH_AUTH_SOCK
File: /run/user/1000/keyring/ssh
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: 0,68 Inode: 81 Links: 1
Access: (0755/srwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-03-19 07:28:45.436018916 +0000
Modify: 2023-03-18 06:20:31.860105581 +0000
Change: 2023-03-19 10:17:03.933082078 +0000
Birth: 2023-03-18 06:20:31.860105581 +0000
通过阅读文档,我了解到podman在容器内以 root 身份运行,但会Map到容器外的用户(或类似的东西)。所以我尝试将我的Dockerfile改为使用root
而不是user
:
FROM docker.io/fedora:39@sha256:531209ee9007c2bf909c6548b0456524bde9da0a1ac95ecc67bf3b98e9046969
ARG HOST
RUN dnf install -yq git
WORKDIR /app
COPY foo foo
ENV PATH="${PATH}:/app"
RUN mkdir -p /root/.ssh
WORKDIR /root
RUN printf "Host $HOST\n\tStrictHostKeyChecking no\n" >> .ssh/config
ENTRYPOINT ["foo"]
重新构建,然后尝试类似的东西:
podman run -it -v $SSH_AUTH_SOCK:/root/keyring:Z -e SSH_AUTH_SOCK=/root/keyring -eREPO=$REPO foo
但我还是得到了一个Permission denied (publickey).
我已经检查了主机中的stat $SSH_AUTH_SOCK
包含Context: system_u:object_r:container_file_t:s0:c235,c239
(因此我相信:Z
选项可以正常工作)。
谁能帮我弄明白我做错了什么?
在Fedora上使用Podman 4.4.2。
更新
我卸载了podman
并安装了docker-ce
,它在第一次尝试时工作(尝试了修改后的Dockerfile)。
不过我还是更喜欢住在Podman酒店。
1条答案
按热度按时间cbjzeqam1#
我也曾遇到过这个问题,但我找到了解决办法。
关键是在您的运行中添加
--privileged
(现在让我们先不考虑安全性问题)下面是我的Dockerfile:
使用以下内容构建:
并运行以下运行:
Idk为什么
StrictHostKeyChecking no
不工作,但一旦你只说是,它可以做ssh事务。我也尝试了
--cap-add ALL
,但不知何故失败了:当我在
ssh -vT git@github.com
中打开-v选项时,沿着调试消息,我确实发现了这个错误:所以通过
cap-add
添加所有的linux权限并不足以获得权限。我觉得在做
--privileged
的时候有一些安全提升,但我不是Maven。在我的主机中,我们启用了SELinux……所以这可能也是一个因素idk。但希望这有帮助。