コンテナとクライアントに rsyncコマンドがインストールされていれば、sshを経由しなくても docker exec コマンドを通じてrsyncが利用できます。
rsync のオプションに
--blocking-io -e 'docker exec -i'
をつけることで コンテナ名:パス でローカル側とファイルのやりとりができます。
例
カレントディレクトリの 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 .
コンテナ側はrootユーザでアクセスされるため、-a オプション だとパーミッション、ユーザ、オーナも同期されてしまい、UID,GIDを合わせた環境でないと意図しないユーザ・グループになるので注意が必要です。-a は -rlptgoD をまとめたものなので、-rlptgoD から p(perms), g(group), o(owner)を抜いた -rltDv をつかえば問題を回避できます。内容によっては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