使用rsync在Docker容器中传输文件
如果容器和客户端都安装了rsync命令,那么可以通过docker exec命令而无需通过ssh来使用rsync。
以下是rsync的选项:
rsync选项的意思是:
--blocking-io -e 'docker exec -i'
通过给容器指定本地路径,可以在容器和本地之间进行文件交互(ContainerName:Path)。
子)我喜欢在早晨散步,因为那是一天中最美好的时刻。
将当前目录中work文件夹的内容同步到rsync-test容器的/work目录下。
rsync --blocking-io -e 'docker exec -i' -av work rsync-test:/
将 rsync-test 容器的 /work 内容与当前目录下的 work 目录内容进行同步。
rsync --blocking-io -e 'docker exec -i' -av rsync-test:/work .
由于容器是以根用户访问的,所以使用-a选项会导致权限、用户和所有者也同步,并且需要在具有相同UID和GID的环境中才能成为意外的用户或组,请注意。-a是从-rlptgoD合并而来的,因此可以使用-rltDv来避免问题,其中去掉了p(权限)、g(组)和o(所有者)。根据内容,可能需要保留p。
在已经安装了rsync的容器中进行操作并进行确认。
以下是一个例子,演示如何创建rsync-test容器并修改/etc目录。我们将使用debian:jessie镜像,在其上安装rsync,并使用一个简单的Dockerfile启动一个空闲的服务器。您可以使用该容器来测试rsync的同步功能。
$ git clone https://github.com/mamemomonga/docker-container-rsync-demo.git
$ cd docker-container-rsync-demo/debian-jessie
$ cat Dockerfile
Dockerfile的内容如下。
FROM debian:jessie
RUN set -xe && \
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y rsync
CMD ["/bin/sh","-c","while true; do sleep 1; done"]
创建镜像和启动容器
$ docker build -t debian-jessie-rsync-test .
$ docker run --name rsync-test -d debian-jessie-rsync-test
将远程/etc目录移到本地的work目录下
$ rsync --blocking-io -e 'docker exec -i' -rltDv rsync-test:etc work/
尝试在本地创建一个空文件。
$ touch work/etc/hogehoge
将本地的 work/etc 覆盖到远程的 /etc
$ rsync --blocking-io -e 'docker exec -i' -rltDv work/etc rsync-test:/
请确认etc/hogehoge是否已成功上传。
$ docker exec rsync-test ls -al /etc/hogehoge
停止、删除容器和删除镜像。
$ docker stop rsync-test
$ docker rm rsync-test
$ docker rmi debian-jessie-rsync-test
仅需一种选择
提供以下内容的中文本地化表达方式:
参考资料
-
- docker exec -i as a transport for rsync -e #13660
-
- rsync
- DEBIAN_FRONTEND=noninteractive ってなんだ