使用GitLab CI+rsync部署Symfony项目遇权限与目录异常问题
问题详情
首次推送(服务器无项目文件)
rsync执行正常,命令及输出:
rsync --exclude="\.git" -e ssh -avz --delete-after . $SSH_USER@$SSH_HOST:blog_symfony/ building file list ... done created directory blog_symfony [...]\nsent 44,533,927 bytes received 5,523 bytes 5,239,935.29 bytes/sec total size is 238,959,003 speedup is 5.37
第二次推送异常
rsync报错权限不足,输出:
rsync: [generator] delete_file: rmdir(project/blog_symfony/project/blog_symfony) failed: Permission denied (13) rsync: [generator] delete_file: rmdir(project/blog_symfony) failed: Permission denied (13) deleting project/blog_symfony/translations/.gitignore deleting project/blog_symfony/translations/ [...]\n annot delete non-empty directory: project/blog_symfony cannot delete non-empty directory: project rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1207) [sender=3.1.3] sent 13,924 bytes received 175 bytes 28,198.00 bytes/sec total size is 238,959,004 speedup is 16,948.65 Cleaning up project directory and file based variables 00:01 ERROR: Job failed: exit code 1
服务器目录权限问题
服务器blog_symfony目录下自动生成的project文件夹属主为root,无法通过GitLab CI删除:
drwxrwxr-x 3 root root 4096 Dec 14 23:26 project
GitLab CI配置
before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" >> ~/.ssh/config' script: - ls - apt-get update && apt-get install rsync -y - ssh $SSH_USER@$SSH_HOST "ls" - rsync --exclude="\.git" -e ssh -avz --delete-after . $SSH_USER@$SSH_HOST:blog_symfony/ - ssh $SSH_USER@$SSH_HOST "cd blog_symfony && docker-compose build && docker-compose up"
解决方案
1. 手动清理现有异常目录
登录目标服务器,执行以下命令删除root属主的project目录:
sudo rm -rf /path/to/blog_symfony/project
(替换/path/to为服务器上blog_symfony的实际路径)
2. 修正Docker容器的运行用户
问题根源是Docker容器以root用户运行,生成的文件/目录属主为root,导致后续rsync无法删除。解决方法:
- 方法一:在Dockerfile中指定运行用户
在Symfony项目的Dockerfile中添加以下内容,创建并使用普通用户:# 替换为服务器SSH用户的UID和GID,可通过`id -u`和`id -g`在服务器上查看 RUN useradd -u 1000 -m appuser USER appuser - 方法二:在docker-compose.yml中指定用户
在docker-compose.yml的服务配置中添加user字段:services: your_symfony_service: # 替换为实际服务名 user: "1000:1000" # 格式为UID:GID,对应服务器SSH用户的ID
3. 调整GitLab CI脚本,提前处理权限问题
在rsync命令前添加步骤,确保异常目录可被清理:
- 方案A:给SSH用户配置sudo免密权限后,直接删除目录(需注意服务器安全):
在CI脚本的script部分,rsync命令前添加:- ssh $SSH_USER@$SSH_HOST "sudo rm -rf blog_symfony/project || true" - 方案B:先修改目录权限为SSH用户所有,再进行rsync:
- ssh $SSH_USER@$SSH_HOST "sudo chown -R $SSH_USER:$SSH_USER blog_symfony/project || true"
4. 优化rsync命令(可选临时方案)
如果暂时无法彻底解决权限问题,可跳过project目录的同步和删除:
rsync --exclude="\.git" --exclude="project" -e ssh -avz --delete-after . $SSH_USER@$SSH_HOST:blog_symfony/
内容的提问来源于stack exchange,提问作者Camel4488
相关产品推荐
相关产品推荐

