You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:15:38