使用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 ってなんだ