本站公告: PUI正式上线,欢迎体验。

在Docker和本地系统内的Gogs之间共享端口22

技巧积累 Mignon 141浏览 0评论

在使用docker安装gogs时,一般会把容器的22端口映射到主机的其它端口(比如10022)

在以SSH方式clone项目时,URL长这样

ssh://git@git.example.com:10022:username/project.git

但我们想要的是类似于GitHub那样的,这时需要把Gogs的SSH端口设置为22

git@git.example.com:username/project.git

下面说一下主要步骤

创建git用户

[root]$ useradd git
[root]$ id git    # 获取uid和gid
uid=1002(git) gid=1002(git) groups=1002(git)
[root]$ usermod -aG docker git    # 把git用户加入docker组
[root]$ su git
[git]$ mkdir -p ~/gogs/data   # 在git用户下创建gogs/data文件夹,作为gogs容器主要数据的挂载目录

安装Gogs

# PUID PGID与上面获取的uid gid保持一致
[git]$ docker run -d --name=gogs -p 10022:22 -p 10080:3000 -v ~/gogs/data:/data \
 -e "PUID=1002" -e "PGID=1002" --restart=always gogs/gogs
[git]$ ln -s ~/gogs/data/git/.ssh ~/    # 将gogs的.ssh目录软连接到本地的.ssh

现在可以通过服务器外网ip:10080进入安装页面,也可以等反代设置好后通过域名进行访问

生成SSH key

[git]$ ssh-keygen -t rsa -b 4096 -C "git@git.example.com"
[git]$ cd ~/.ssh
[git]$ cat id_rsa.pub >> authorized_keys
[git]$ chmod 600 authorized_keys

在authorized_keys最前面添加

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1y..........YGedddqAN6w== git@git.example.com

配置git用户登录问题

[root]$ mkdir -p /app/gogs/
[root]$ cat >/app/gogs/gogs <<'END'
#!/bin/sh
ssh -p 10022 -o StrictHostKeyChecking=no git@127.0.0.1 \
 SSH_ORIGINAL_COMMAND=$(printf '%q' "$SSH_ORIGINAL_COMMAND") "$0" "$@"
END
[root]$ chmod 755 /app/gogs/gogs

这样就差不多完成了,下面需要在本地生成SSH密匙,然后在web端把密匙添加到Gogs

如果需要修改Gogs的配置,比如安装的时候DOMAIN写的IP现在要修改为域名,可以到/home/git/gogs/data/gogs/conf/找到app.ini,修改完后重启gogs容器

#更新 2018-08-21

解决:新建用户后,如果用户使用SSH克隆代码,Gogs每次都会重新生成 '.ssh/authorized_keys' 文件,这样每次都需要将git用户的id_rsa.pub添加到'.ssh/authorized_keys' 中

[root]$ echo ‘’ > /app/gogs/gogs
[root]$ cat >/app/gogs/gogs <<'END'
#!/bin/sh
if [ `grep -c "git@git.example.com" /home/git/.ssh/authorized_keys` -eq '0' ]; then
    idRsa=`cat /home/git/.ssh/id_rsa.pub`
    echo "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty $idRsa" >> /home/git/.ssh/authorized_keys
fi
ssh -p 10022 -o StrictHostKeyChecking=no git@127.0.0.1 \
 SSH_ORIGINAL_COMMAND=$(printf '%q' "$SSH_ORIGINAL_COMMAND") "$0" "$@"
END
[root]$ chmod 755 /app/gogs/gogs

这样每次SSH链接的时候都去判断 '.ssh/authorized_keys' 文件中是否存在当前用户的SSH key,如果没有添加到 '.ssh/authorized_keys' 文件中


参考Share port 22 between Gogs inside Docker & the local system

转载请注明:码农博客 » 在Docker和本地系统内的Gogs之间共享端口22

游客
发表我的评论 换个身份
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  • 验证码 (必填)点击刷新验证码