由于 SSH 在容器内运行,因此,如果需要 SSH 支持,则需要将 SSH 从主机传递到容器。一种选择是在非标准端口上运行容器 SSH(或将主机端口移至非标准端口)。另一个可能更直接的选择是将 SSH 连接从主机转发到容器。下面将说明此设置。
配置端口转发
.ssh/config 文件中定义的 Host、HostName 和 Port 等参数与服务器的实际配置匹配,例如:
Host git.example.top # 必须完全匹配你的域名
HostName git.example.top
Port 222
User git
IdentityFile ~/.ssh/id_rsa
Tip
id_rsa一般用于ssh免密登录,我们也可以复用github配置ssh免密时生成的密钥,一般名为id_edxxx,可自行在~/.ssh目录下查看,此外注意这里IdentityFile配置的是私钥,而在github或gitea设置里配置的是公钥
如果未配置 .ssh/config,可以直接使用完整格式测试:
Tip
在SSH协议中,ssh://前缀是可选的。GitHub和Gitea的处理方式不同是因为:
- GitHub的SSH地址格式是简写形式,Git能自动识别为SSH协议
- Gitea在某些配置下(特别是非标准端口时)需要明确协议类型
git clone ssh://git@<服务器IP地址或域名>:<Gitea的SSH端口号>/jdysya/repository.git.git
通过以下命令测试是否能够连接上服务器
ssh -T git@git.example.top若Host设置为其他别名
例如将Host设置为git
Host git # 自定义别名
HostName git.example.top
Port 222
User git此时我们执行
git clone git:jdysya/repository.git
实际流程如下:
-
Git 自动补全
Git 会将简写地址补全为完整 SSH 格式:git:xxx → ssh://git@git:xxx -
SSH 配置匹配
SSH 发现访问的是Host git,于是:-
将目标地址替换为
git.example.top:222 -
自动附加用户
git -
最终实际连接:
ssh://git@git.example.top:222/jdysya/repository.git
-
关键原理
Host git中的git是一个本地占位符,与真实域名无关- 这种写法本质是用别名替代了完整地址,类似 Shell 的别名功能
- 要求:
- 必须保持
User git(Gitea/GitHub 的强制要求)- 必须确保别名不会和真实命令冲突(如避免用
ssh等系统关键字)