svn 是一种集中式版本管理系统。最新文件存储在服务器上,用户需要先从服务器下载(检出)最新文件,修改后再提交到服务器。版本信息也是放在服务器上,如果连接不上服务器,则无法提交、还原、对比等操作。
优点是符合一般的思维逻辑,适合做团队内部文档共享、管理系统。
1.下载镜像与运行容器
docker run --name svn \
--detach \
--volume /root/container/svn:/var/opt/svn \
--publish 3690:3690 \
garethflowers/svn-server
以上命令运行的镜像是 garethflowers/svn-server,如果本地没有则会下载。
2.创建新的仓库
docker exec -it svn svnadmin create repo1
创建一个名为 repo1 的仓库。查看其对应的文件目录,包含如下文件:
ls /root/container/svn/repo1
conf db format hooks locks README.txt
3.修改配置文件
仓库路径下 conf 为配置文件目录,有以下文件:
ls ./repo1/conf
authz hooks-env.tmpl passwd svnserve.conf
修改 svnserve.conf
[general]
anon-access = none # 匿名用户不可读写,也可设置为只读 read
auth-access = write # 授权用户可写
password-db = passwd # 密码文件路径,相对于当前目录
authz-db = authz # 访问控制文件
realm = /var/opt/svn/repo1 # 认证命名空间,会在认证提示界面显示,并作为凭证缓存的关键字,可以写仓库名称
配置账号与密码,修改 passwd,格式为“账号 = 密码”
[users]
# harry = harryssecret
# sally = sallyssecret
eric = 123456
配置权限,修改 authz
[groups]
owner = eric, user1
[/] # / 表示所有仓库
eric = rw # 用户 eric 在所有仓库拥有读写权限
[repo1:/] # 表示以下用户在仓库 repo1 的所有目录有相应权限
user1 = rw
@owner = rw # 表示 owner 组下的用户拥有读写权限
说明,r 表示读,w 表示写。没有设置的用户默认为无权限。
注意:更改svnserve.conf,authz和passwd文件时不需要重启。
附加内容
上面的 svn 服务器不支持 http 协议访问,如果要支持,可以在上面的容器中安装 Apache 服务器及相应的模块(mod_dav_svn),配置好即可。并将其提交、生成一个新的镜像保存下来。
当然也可以使用 Docker Hub 上已经支持 http 协议访问的镜像。
准备工作:
# 生成一个空的密码文件,用于 Apache 的 HTTP 认证
mkdir -p /root/container/svn/apache
touch /root/container/svn/apache/passwd
运行容器:
docker run -d \
--name svn-server \
-p 21080:80 \
-p 3690:3960 \
--volume /root/container/svn/repo:/home/svn \
--volume /root/container/svn/apache/passwd:/etc/subversion/passwd \
elleflorio/svn-server
创建 http 访问账号
docker exec -t svn-server htpasswd -b /etc/subversion/passwd <username> <password>
此账号和密码被写入容器中的 HTTP 认证文件(/etc/subversion/passwd),且密码是加密的。实践经验表明,既然用 http 协议访问只能查看,那么创建一个公共的账号,供大家使用即可。也可创建与 svn 认证文件中一样的账号和密码。
创建新的仓库
docker exec -it svn-server svnadmin create repo1
svn 客户端的账号权限则在 repo1/conf 的配置文件中配置。见本文前一部分配置说明。
备份数据
svn 存储数据有2种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。
仓库文件(数据)存储路径为 ./repo1/db/revs,注意保护好。一般直接备份整个仓库 ./repo1/。