Dockerizing s3cmd

Dieser Artikel beschreibt (hoffentlich verständlich) wie s3cmd "dockerisiert" werden kann. Hintergrund ist der, dass ich nach einer Möglichkeit gesucht habe, Daten aus einem Docker-Container nach Amazon S3 zu schreiben/lesen.

Was ist dieses Docker? Bevor ich eine holprige Erklärung abliefere, hier die Beschreibung von https://www.docker.com/whatisdocker/:

What is Docker?

Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications. Consisting of Docker Engine, a portable, lightweight runtime and packaging tool, and Docker Hub, a cloud service for sharing applications and automating workflows, Docker enables apps to be quickly assembled from components and eliminates the friction between development, QA, and production environments. As a result, IT can ship faster and run the same app, unchanged, on laptops, data center VMs, and any cloud.

Bei s3cmd handelt es sich um einen Amazon S3 Command Line Client, der die S3-API abbildet, dies ermöglicht das komfortable Manipulieren von S3-Buckets, Upload/Download von Daten und, für mich der entscheidende Punkt, eine rsync-ähnliche Funktionalität zur Erstellung von etwa Backups.

Erstellen der s3cmd-Config

Am einfachsten ist es, die Konfiguration s3cmd zu überlassen, dazu verwendet man folgendes Commmand

% s3cmd --configure

Nachdem alle abgefragten Optionen gesetzt sind, wird im Home-Verzeichnis die Datei .s3cfg erstellt, die s3cmd zukünftig für die Kommunikation mit S3 benutzt. Eine .s3cfg könnte ungefähr so aussehen

[default]
access_key = AWSACCESSKEY
bucket_location = US
cloudfront_host = cloudfront.amazonaws.com
cloudfront_resource = /2010-07-15/distribution
default_mime_type = binary/octet-stream
delete_removed = False
dry_run = False
encoding = UTF-8
encrypt = False
follow_symlinks = False
force = False
get_continue = False
gpg_command = /usr/local/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_passphrase = supersecretpassphrase
guess_mime_type = True
host_base = s3.amazonaws.com
host_bucket = %(bucket)s.s3.amazonaws.com
human_readable_sizes = False
list_md5 = False
log_target_prefix = 
preserve_attrs = True
progress_meter = True
proxy_host = 
proxy_port = 0
recursive = False
recv_chunk = 4096
reduced_redundancy = False
secret_key = ACCESS SECRET KEY
send_chunk = 4096
simpledb_host = sdb.amazonaws.com
skip_existing = False
socket_timeout = 300
urlencoding_mode = normal
use_https = True
verbosity = WARNING

Generieren des Docker-Images

Docker-Images lassen sich am einfachsten mit Hilfe von Dockerfiles erstellen, meins sieht wie folgt aus

# Base system is the LTS version of Ubuntu.
FROM    ubuntu:14.04

# Make sure we don't get notifications we can't answer during building.
ENV     DEBIAN_FRONTEND noninteractive

# Download and install everything from the repos.
RUN     apt-get update && apt-get -y upgrade; \
        apt-get -y install s3cmd; \
        apt-get clean

ADD     .s3cfg .s3cfg

ENTRYPOINT  ["/usr/bin/s3cmd"]

Achtung: Damit Docker das Image erfolgreich bauen kann ist es notwendig, dass die zuvor erstellte s3cmd-Config am selben Ort wie das Dockerfile liegt.

Alle Voraussetzungen wären damit erfüllt, man wechselt nun in das Verzeichnis des Dockerfiles und erstellt das Image:

% docker build -t "s3backup" .
% docker images # zeigt das neue Image im Repository

Benutzung

Ein aus diesem Image erstellter Container kann jetzt wie die Anwendung s3cmd selbst genutzt werden, z.B. lässt man sich mit dem nächsten Command die Hilfe ausgeben

% docker run --rm s3backup --help

Mein Anwendungsszenario besteht darin, Daten aus einem "data-only"-Container nach S3 zu synchronisieren. Folgender Befehl zeigt, wie so etwas aussehen könnte:

% docker run --rm --volumes-from data-only s3backup sync --delete-removed -r /data/service/ s3://bucket-name

Durch die Flexibilität kann das Image aber auch für jegliche andere S3-Operation genutzt werden. Wie immer, bei Anmerkung o.ä. findet ihr rechts Links zu meinem ADN, Google+ und GitHub-Profilen.

Lesestoff