我正在努力追随本文我在运行一个非常简单的 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-x
perms rsync 时无法写入它。rsync
据我所知,Rsync 是以 root 身份运行的。我这样说有错吗?