フォローしようとしています。この記事非常に単純なrsyncデーモンDockerコンテナの実行に問題があります。 rsyncデーモンを含むすべてをrootとして実行する必要があるにもかかわらず、ファイルの受信に失敗し、エラー13権限が拒否されました。ここでは、問題を簡単に再現できるように簡単な例を用意していますが、問題を再現するためにネットワークを必要としません。
❯ 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
これは対話型シェルをコンテナに挿入してテストします。デーモンには問題はありませんが、デーモンはファイルを受け取ることができません。
/ # 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/
私が知りたいのは、Perms rsyncがあるので書くことができない理由ですdrwxr-xr-x
。rsync
私が知っている限り、Rsyncはrootとして実行されます。私がそう言うのは間違っていますか?