docker下rsync守护进程权限被拒绝问题

docker下rsync守护进程权限被拒绝问题

我正在努力追随本文我在运行一个非常简单的 rsync 守护进程 docker 容器时遇到问题。它无法接收文件,并给出错误 13 权限被拒绝,即使一切都应该以 root 身份运行,包括 rsync 守护进程。在这里,我准备了一个简单的示例来轻松重现该问题,并且甚至无需进行任何联网即可重现该问题。

❯ cat rsync_daemon.Dockerfile      
FROM alpine
RUN apk add --no-cache rsync \
    && mkdir -p /opt/share \
    && echo "testcontent" > /opt/share/testfile \
    && echo "[share]" > /etc/rsyncd.conf \
    && echo "path = /opt/share" >> /etc/rsyncd.conf  \
    && echo "hosts allow = *" >> /etc/rsyncd.conf \
    && echo "read only = false" >> /etc/rsyncd.conf

CMD rsync --daemon --port 9999 && while sleep 1; do /bin/true; done
❯ mkdir context # create empty dir to use as docker context
❯ docker build -t rsync_manual -f rsync_daemon.Dockerfile context

构建过程没有发生任何事件,您可以确认是否遵循。

docker run -d --rm --name rsyncd_manual rsync_manual

分离的容器运行启动正常。

docker exec -it rsyncd_manual sh

这会将交互式 shell 注入容器中,然后进行测试。它可以很好地从守护进程复制,但守护进程无法接收文件:

/ # ls -la /opt/
total 12
drwxr-xr-x    1 root     root          4096 Sep 30 02:21 .
drwxr-xr-x    1 root     root          4096 Sep 30 02:22 ..
drwxr-xr-x    2 root     root          4096 Sep 30 02:21 share
/ # ls -la /opt/share/
total 12
drwxr-xr-x    2 root     root          4096 Sep 30 02:21 .
drwxr-xr-x    1 root     root          4096 Sep 30 02:21 ..
-rw-r--r--    1 root     root            12 Sep 30 02:21 testfile
/ # ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
/ # rsync -r rsync://localhost:9999/share dest
/ # ls -la dest
total 12
drwxr-xr-x    2 root     root          4096 Sep 30 02:23 .
drwxr-xr-x    1 root     root          4096 Sep 30 02:23 ..
-rw-r--r--    1 root     root            12 Sep 30 02:23 testfile
/ # cat dest/testfile
testcontent
/ # mkdir src
/ # echo 'testdata' > src/testdata
/ # rsync -r src rsync://localhost:9999/share
rsync: [generator] recv_generator: mkdir "/src" (in share) failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1327) [sender=3.2.5]
/ # ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh -c rsync --daemon --port 9999 && while sleep 1; do /bin/true; done
    8 root      0:00 rsync --daemon --port 9999
   79 root      0:00 sh
 1382 root      0:00 sleep 1
 1383 root      0:00 ps aux

有人知道到底发生了什么事吗?

答案1

好吧,这很奇怪......

chmod g+w /opt/share/允许它工作。但在我的其他测试中(与上面相比,它的简化程度稍差一些,它将主机上的一个目录绑定到 rsync 守护进程共享中),我必须这样做chmod o+w

我想知道的是为什么当/opt/share/拥有drwxr-xr-xperms rsync 时无法写入它。rsync据我所知,Rsync 是以 root 身份运行的。我这样说有错吗?

相关内容