docker version: 20.10.24
Docker Compose version v2.27.1
centos 7
docker-compose.yml:
UID和GID都设置为非root用户,Gitea 为了保证安全性,禁止以 root 用户启动
映射一致性:
前期准备工作:为保证权限的统一,在主机上新建用户git
用户身份一致:尽量让容器内指定的 USER_UID 和 USER_GID 与宿主机实际操作挂载目录的用户身份对应。例如,宿主机上是普通用户 user1 (UID 为 1001 ,GID 为 1001 )操作目录,那容器内也设置 USER_UID 为 1001 ,USER_GID 为 1001 ,防止出现权限不匹配问题。
检查用户映射关系:若在容器构建过程中(如 Dockerfile 里)也涉及用户相关设置,要确保 docker compose 里指定的 USER_UID 和 USER_GID 与 Dockerfile 里的用户设置不冲突,避免出现权限紊乱。
docker-compose.yml
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.21.1
container_name: gitea
environment:
- USER_UID=1002 //对应新建的git用户的uid和gid
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: no
networks:
- gitea
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- /home/git/.ssh/:/data/git/.ssh //容器内ssh目录和主机上用户的ssh目录映射
ports:
- "3000:3000"
- "127.0.0.1:222:22"
depends_on:
- db
db:
image: mysql:8
container_name: gitea_mysql
restart: no
environment:
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks:
- gitea
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
docker compose up -d 启动命令,-d后台启动
启动http://<host>:3000/ 初始界面,"git" 这个用户在创建容器的时候已经自动创建好了,可进入容器内查看,表示在容器内是以git这个用户运行
查看用户的uid和gid,和compose 文件中的对应,最好也要和容器中的git用户的uid,和gid对应,比如容器内git用户是1000,1000,主机上新建的git用户最好也是1000,1000
配置ssh:
主机上执行:sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key",中间不用设置密码,一路回车
会生成公钥和私钥:
在ssh目录下新建authorized_keys文件,将公钥复制到文件中
至此,主机和容器之间的ssh打通,测试
接下来需要配置远端拉取代码支持ssh
windows远端打开git终端
输入ssh-keygen -t rsa -b 4096 -C "your_email@example.com",后面的邮箱自己指定,跟之前在主机上生成公钥和私钥一样,一路回车
完成后会生成公钥和私钥文件,windows上会在用户目录下
将公钥添加到管理界面的SSH/GPG中:
保存之后会看到公钥同步到了主机上的authorized_keys,因为compose文件中配置了同步卷
这里是一个命令转发,主机会将ssh命令转发到容器,通过/usr/local/bin/gitea 这个文件,所以需要在主机上/usr/local/bin/新建gitea这个文件,
将下面这段代码复制到文件中,并且给文件赋予执行权限
#!/bin/bash
ssh -p 222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
222对应compose中配置的端口,git对应主机用户
至此配置完成
新建仓库测试:
新建文件推送至仓库,使用ssh方式
文件成功推送