Docker 搭建 git

1. 获取Linux镜像[注1,注2]

1
2
3
4
5
6
7
8
9
10
11
# 获取最新版 ubuntu
$ docker pull ubuntu

# 查看所有镜像
$ docker images ls
> REPOSITORY TAG IMAGE ID CREATED SIZE
> ubuntu latest adafef2e596e 9 days ago 83.8MB
> ...

# 启动容器
$ docker run -it ubuntu /bin/bash

2. 容器内安装与配置git

2.1. 安装 git[注3]

1
2
3
4
5
6
7
8
9
# 修改 ubantu 用户密码
$ sudo passwd

## 安装可能需要的工具
$ apt-get update
$ apt-get install git
$ apt-get install vim
$ apt-get install rpm
$ apt-get install net-tools

2.2. 创建一个 git 用户,用来运行 git 服务

1
2
# 用户名是 git ,设置密码(我这里是gaopeng),按照提示 enter
$ adduser git

2.3. 创建证书登录[注4]

1
2
3
4
5
6
7
8
9
10
11
# win10用户获取公钥,按照提示 enter,默认保存在 C:\Users\用户名\.ssh
$ ssh-keygen -t rsa -C "这里写注释,方便辨别"

# 切换为上面创建的 git 用户,并获取公钥
$ su git
$ ssh-keygen -t rsa

# 将公钥 id_rsa.pub 导入到 /home/git/.ssh/authorized_keys 文件里,一行一个
$ touch authorized_keys
$ vim authorized_keys

2.4. 初始化Git仓库

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令,就会创建一个裸仓库,裸仓库没有工作区,然后,把owner改为git

1
2
3
4
5
6
7
# 创建一个裸仓库
$ cd /srv/
$ git init --bare sample.git
> Initialized empty Git repository in /srv/sample.git/

# 把owner改为'git'
$ chown -R git:git sample.git

2.5. 禁用shell登录

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成

1
2
3
4
5
# 在 /etc/passwd 找到类似下面的一行
git:x:1001:1001:,,,:/home/git:/bin/bash

# 改为下面,这样,git用户可以正常通过ssh使用git,但无法登录到主机,因为我们为git用户指定的git-shell每次一登录就自动退出
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

3. 使用 git[注5]

3.1. 克隆远程仓库

1
2
3
4
5
$ git clone git@我的ip:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

ssh: Could not resolve hostname server: Name or service not known

  1. 报错no matching manifest for windows/amd64 10.0.18362 in the manifest list entries,解决方法,设置 daemon.jsonexperimental:true

  2. 报错

    1
    C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error response from daemon: failed to start service utility VM (createreadwrite): hcsshim::CreateComputeSystem fcf43c4f386fb27bf9f5ca808e6bd6f0b63b8b0136ca4650ca39575d0db493e2_svm: The virtual machine could not be started because a required feature is not installed.

    需要开启 windows 虚拟化

  3. 报错bash: sudo: command not found

    1
    2
    apt-get update
    apt-get install sudo
  4. 如果希望ssh公钥生效需满足至少下面两个条件:

    1
    2
    1) .ssh目录的权限必须是700
    2) .ssh/authorized_keys文件权限必须是600
  5. 报错

    1
    2
    3
    4
    5
    ssh: Could not resolve hostname server: Name or service not known
    fatal: Could not read from remote repository.

    Please make sure you have the correct access rights
    and the repository exists.

    参见“给docker容器分配静态ip地址”