A simple rsync server/client Docker image to easily rsync data within Docker volumes
Get files from remote server within a docker volume
:
$ docker run --rm -v blobstorage:/data/ eeacms/rsync \
rsync -avzx --numeric-ids [email protected]:/var/local/blobs/ /data/
Get files from remote server
to a data container
:
$ docker run -d --name data -v /data busybox
$ docker run --rm --volumes-from=data eeacms/rsync \
rsync -avz [email protected]:/var/local/blobs/ /data/
Start client to pack and sync every night:
$ docker run --name=rsync_client -v client_vol_to_sync:/data \
-e CRON_TASK_1="0 1 * * * /data/pack-db.sh" \
-e CRON_TASK_2="0 3 * * * rsync -e 'ssh -p 2222' -aqx --numeric-ids [email protected]:/data/ /data/" \
eeacms/rsync client
Copy the client SSH public key printed found in console
To use the same generated keys on docker container re-creation, you need to persist the key directory ( /root/.ssh
) in a Docker volume. On first start the keys will be created, and then, on all subsequent starts they will be re-used.
For example, you can use a volume called ssh-key
like this:
$ docker run --name=rsync_client -v ssh-key:/root/.ssh -v client_vol_to_sync:/data
eeacms/rsync client
To use the same generated host keys on docker container re-creation, you need to persist the host key directory ( /ssh_host_keys
) in a Docker volume. On first start the keys will be created, and then, on all subsequent starts they will be re-used.
$ docker run --name=rsync_server -v ssh-host-keys:/ssh_host_keys -v server_vol_to_sync:/data
eeacms/rsync server
If you want the rsync client to skip checking the ssh host keys, you can always add this 2 parameters to your client ssh configuration -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
Start server on foo.bar.com
# docker run --name=rsync_server -d -p 2222:22 -v ssh-host-keys:/ssh_host_keys -v server_vol_to_sync:/data \
-e SSH_AUTH_KEY_1="<SSH KEY FROM rsync_client>" \
-e SSH_AUTH_KEY_n="<SSH KEY FROM rsync_client_n>" \
eeacms/rsync server
Add test
file on server:
$ docker exec -it rsync_server sh
$ touch /data/test
Bring the file
on client:
$ docker exec -it rsync_client sh
$ rsync -e 'ssh -p 2222' -avz [email protected]:/data/ /data/
$ ls -l /data/
-
Request TCP access to port 2222 to an accessible server of environment of the new installation from the source container host server.
-
Start rsync client on host from where do you want to migrate data (ex. production).
Infrastructures -> Hosts -> Add Container
- Select image: eeacms/rsync
- Command: sh
- Volumes -> Volumes from: Select source container
-
Open logs from container, copy the ssh key from the message
-
Start rsync server on host from where do you want to migrate data (ex. devel). The destination container should be temporarily moved to an accessible server ( if it's not on one ) .
Infrastructures -> Hosts -> Add Container
- Select image: eeacms/rsync
- Port map -> +(add) : 2222:22
- Command: server
- Add environment variable: SSH_AUTH_KEY=""
- Volumes -> Volumes from: Select destination container
-
Within rsync client container from step 1 run:
$ rsync -e 'ssh -p 2222' -avz <SOURCE_DUMP_LOCATION> root@<TARGET_HOST_IP_ON_DEVEL>:<DESTINATION_LOCATION>
- The rsync servers can be deleted, and the destination container can be moved back ( if needed )