From 5d34f00834f29274fd484a0076adaa04b0d00ada Mon Sep 17 00:00:00 2001 From: Ognjen Vukovic Date: Sun, 12 Apr 2020 23:43:33 +0200 Subject: [PATCH] Version 0.1 is ready --- Dockerfile | 10 ++++++ README.md | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++ rsync.sh | 47 ++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100755 rsync.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..288235b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM alpine + +RUN apk add --update-cache \ + rsync \ + tzdata \ + && rm -rf /var/cache/apk/* + +COPY rsync.sh . + +ENTRYPOINT [ "./rsync.sh" ] diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7ff6a2 --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# rsync + +rsync is an open source utility that provides fast incremental file transfer. + +If you are into Dockerizing everything or you just want to have a better view +over the rsync process (e.g., to see it in your cluster visualizer), +this repository provides you with a Docker image to run the rsync process. + +The provided image is open-source and built from scratch with the goal to +enable you to run a stateless and an immutable container, according to the best +practices. + +Supported architectures: + +* the image supports multiple architectures: `x86-64` and `arm32` +* the docker manifest is used for multi-platform awareness +* by simply pulling or running `ogivuk/rsync:latest`, the correct image for your architecture will be retreived + +| Tag | Transmission Version and Architecture | +| :--- | :---- | +| `:latest` | supports both `x64` and `arm32v7` architectures | +| `:x64` | targeted to the `x64` architecture | +| `:arm32v7` | targeted to the `arm32v7` architecture | + +## Usage + +### Quick Start: one time run, local, no logs + +```bash +docker run --rm \ + --name=rsync \ + --volume /path/to/source/data:/data/src \ + --volume /path/to/destination/data:/data/dst \ + ogivuk/rsync [OPTIONS] /data/src/ /data/dst/ +``` + +Replace: + +* `/path/to/source/data` with the source folder to be copied or backed-up +* `/path/to/destination/data` with the destination folder +* `[OPTIONS]` with desired rsync optional arguments + +### Start with All Options Explained + +1. _First time only_: Prepare the setup + * create a folder, for example `~/rsync`, that will be later mounted in the container + * this folder is intended to hold supporting files such as log files, a list of files to rsync, a file with exclude patterns, etc. + * the subfolder `logs`, for example `~/rsync/logs` is intended for the log files + * important note: for Docker Swarm, this directory **needs to be available on all nodes in Docker swarm**, e.g., via network shared storage + + ```bash + mkdir -p ~/rsync/logs + ``` + + * replace `~/rsync` with any other desired location + +2. Start + * as a container: + + ```bash + docker run --rm \ + --name=rsync \ + -e TZ="Europe/Zurich" \ + -e RSYNC_LOG="rsync" \ + -e RSYNC_CRON="* 5 * * *" \ + --volume ~/rsync:/rsync + --volume /path/to/source/data:/data/src \ + --volume /path/to/destination/data:/data/dst \ + ogivuk/rsync [OPTIONS] /data/src/ /data/dst/ + ``` + + * Replace: + * `~/rsync/` with a folder created in the step 1. (if another is chosen) + * `/path/to/source/data` with the source folder to be copied or backed-up + * `/path/to/destination/data` with the destination folder + * `[OPTIONS]` with desired rsync optional arguments + * as a swarm service: + + ```bash + docker service create \ + --name=rsync \ + -e TZ="Europe/Zurich" \ + -e RSYNC_LOG="rsync" \ + -e RSYNC_CRON="0 5 * * *" \ + --mount type=bind,src=~/rsync,dst=/rsync \ + --mount type=bind,src=/path/to/source/data,dst=/data/src \ + --mount type=bind,src=/path/to/destination/data,dst=/data/dst \ + ogivuk/rsync [OPTIONS] /data/src/ /data/dst/ + ``` + + * Replace: + * `~/rsync/` with a folder created in the step 1. (if another is chosen) + * `/path/to/source/data` with the source folder to be copied or backed-up + * `/path/to/destination/data` with the destination folder + * `[OPTIONS]` with desired rsync optional arguments + +Parameters + +| Parameter | Function | +| --- | ------- | +| `-e TZ="Europe/Zurich"` | Sets the timezone in the container, which is important for the correct timestamping of logs. Replace `Europe/Zurich` with your own timezone from the list of available [timezones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). | +| `-e RSYNC_LOG="rsync"` | Enables the logging or the rsync output. The provided value will be the prefix for the log file name which is appended with the date and time of the rsync execution, e.g., `rsync.20200101-12:34.log`. | +| `-e RSYNC_CRON=1` | Specifies that the rsync is to be run as a cron job. The provided value needs to be a cron expression describing when to run the rsync job, and this expression will be appended to the crontab. | diff --git a/rsync.sh b/rsync.sh new file mode 100755 index 0000000..b6a4425 --- /dev/null +++ b/rsync.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +# rsync.sh - a script to configure the rsync job in the container + +### PREPARATION + +echo "Preparation steps started." + +# should logs be created? +if [ "$RSYNC_LOG" != "" ]; then + # logging enabled + echo "Logging selected." + # the specific name is to be used + LOG_COMMAND=" >> /rsync/logs/$RSYNC_LOG"'.$(date +%Y%m%d-%H%M).log 2>&1' + echo "Logging command is $LOG_COMMAND" +else + # no logs + echo "Logging NOT selected." + LOG_COMMAND="" +fi + +# run as a cron job? +if [ "$RSYNC_CRON" != "" ]; then + # yes, run it as a cron job + echo "Running rsync as a cron job selected." + # make a crontab entry + #shift + echo "$RSYNC_CRON rsync $@$LOG_COMMAND" >> /etc/crontabs/root + echo "Entry created in the crontab" +else + # no cron job + echo "Running rsync as a cron job NOT selected." +fi + +echo "Preparation steps completed." + +### EXECUTION + +if [ "$RSYNC_CRON" != "" ]; then + # run as a cron job, start the cron daemon + echo "Starting the cron daemon..." + crond -f +else + # one time run + echo "Executing rsync as an one time run..." + eval rsync $@"$LOG_COMMAND" +fi