Docker部署svn

启动svn server

创建Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir -p /usr/local/src/svn && cd /usr/local/src/svn
cat > "Dockerfile" << EOF
FROM maisi/alpine:latest

CMD ["/usr/bin/svnserve", "--daemon", "--foreground", "--root", "/var/opt/svn"]
EXPOSE 3690
HEALTHCHECK CMD netstat -ln | grep 3690 || exit 1
VOLUME ["/var/opt/svn"]
WORKDIR /var/opt/svn

RUN echo http://mirrors.aliyun.com/alpine/v3.14/main/ > /etc/apk/repositories && apk update && apk upgrade
RUN apk add --no-cache \
subversion wget
EOF

构建svn server镜像

1
docker build -t svn .

生成svn server容器

1
2
3
4
5
docker run --name svn \
--privileged=true \
-v /data/svn:/var/opt/svn \
-p 3690:3690 \
-d svn:latest

开放防火墙端口

1
2
firewall-cmd --zone=public --add-port=3690/tcp --permanent
firewall-cmd --reload

配置svn server

创建用户组及用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat > /data/svn/authz << EOF
[groups]
maisi = alice,bob

[/]
alice = rw

[maisi:/]
@maisi = rw
EOF

cat > /data/svn/passwd << EOF
[users]
alice = 123456789
EOF
  • [/]:所有仓库
  • [maisi:/]:仅maisi仓库
  • @maisi = rw:maisi组内所有用户拥有读写权限

创建示例仓库maisi

1
docker exec -it svn svnadmin create maisi

每个仓库都有独立的conf/svnserve.conf配置文件,配置文件中指定密码文件(passwd)和授权文件(authz)的路径。

可以将每个仓库的passwd和authz都指向同一个文件,这样只需要建立一套账号和授权即可。

配置仓库

1
2
3
4
5
6
docker exec -it svn /bin/sh -c "cd /var/opt/svn/maisi/conf/ \
&& sed -i '/# anon-access = read/a\anon-access = none' svnserve.conf \
&& sed -i '/# auth-access = write/a\auth-access = write' svnserve.conf \
&& sed -i '/# password-db = passwd/a\password-db = \/var/opt\/svn\/passwd' svnserve.conf \
&& sed -i '/# authz-db = authz/a\authz-db = \/var/opt\/svn\/authz' svnserve.conf \
&& sed -i '/# realm = /a\realm = Maisi Lab' svnserve.conf"

当多个仓库共用同一个passwd和authz时,可以让这些仓库使用相同的realm(默认值是仓库的UUID)。当客户端检测到相同的realm后,则可以共用保存在客户端的用户名和密码进行认证。

重启svn server

1
docker restart svn