在使用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