默认情况下,想要启用Gitea的SSH代码拉取,必须要修改SSH端口或者禁用主机上的SSH。若想要直接使用宿主机上的SSHD,需要进行一些配置。
Method A: 通过SSH透传
建议使用
- 在宿主机上创建
git用户 - 切换到新用户,使用
id命令确定git用户的UID和GID,并将容器中运行的Gitea设置为相同的UID和GID(通过容器的USER_UID和USER_GID环境变量) - 将容器的SSH映射到主机上,检查端口是否可以正常访问,例如映射到
2222端口:ssh [email protected] -p2222,应当得到鉴权失败之类的信息,而不是等待许久之后报错无法连接 - 使用
git用户创建一对SSH密钥用于连接到Gitea:ssh-keygen - 将公钥写回到
authorized_keys:cat ~/.ssh/id_*.pub >> ~/.ssh/authorized_keys - 将
/home/git/.ssh映射到容器中Gitea写入.ssh的位置,一般是/home/git/.ssh,可以通过Gitea app.ini的SSH_ROOT_PATH配置(配置此项请参考Gitea文档的Config Cheatsheet)。 - 尝试在Gitea中添加一些密钥,检查宿主机目录中的
/home/git/.ssh/authorized_keys中是否有内容,如果没有内容,则需要在Gitea后台中的“计划任务”页面手动执行“更新.ssh/authorized_keys”任务。然后找到要执行的命令是什么,即command=后的内容,一般是/usr/local/bin/gitea ...。 在宿主机上同样的位置创建一个转发用的脚本并赋予执行权限,将SSH命令转发到容器中。
#!/bin/bash ssh -p 2222 -o StrictHostKeyChecking=no [email protected] "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"- 尝试拉取代码
Method B: 通过容器命令透传
- 在宿主机上创建
git用户 - 切换到新用户,使用
id命令确定git用户的UID和GID,并将容器中运行的Gitea设置为相同的UID和GID(通过容器的USER_UID和USER_GID环境变量) - 允许新用户访问docker:
usermod -G docker,针对k8s,请为其创建一份有效的kubeconfig,使其可以访问容器并执行命令 - 将
/home/git/.ssh映射到容器中Gitea写入.ssh的位置,一般是/home/git/.ssh,可以通过Gitea app.ini的SSH_ROOT_PATH配置(配置此项请参考Gitea文档的Config Cheatsheet)。 - 尝试在Gitea中添加一些密钥,检查宿主机目录中的
/home/git/.ssh/authorized_keys中是否有内容,如果没有内容,则需要在Gitea后台中的“计划任务”页面手动执行“更新.ssh/authorized_keys”任务。然后找到要执行的命令是什么,即command=后的内容,一般是/usr/local/bin/gitea ...。 在宿主机上同样的位置创建一个转发用的脚本并赋予执行权限,将SSH命令转发到容器中。
#!/bin/bash docker exec -u git -i -e SSH_ORIGINAL_COMMAND="$SSH_ORIGINAL_COMMAND" gitea /usr/local/bin/gitea $@ # For K8s #_PARAMETERS=$@ #kubectl --kubeconfig /path/to/kubeconfig exec deployments/gitea -i -q -- su git -l -s /bin/sh -- -c "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" /usr/local/bin/gitea $_PARAMETERS""- 测试拉取推送代码