sekka1/docker-s3cmd: s3cmd in a Docker container はいちいちコンテナにログインして、/opt/main.sh
を叩かなければならないのがだるかったので、ホスト側からあまりコンテナを意識せずに使えるようなやり方を考えてみた。
なお、下記ではアクセス先がニフティクラウド オブジェクトストレージになっていますが、少しいじれば他の S3 互換 API でも利用可能だと思います。
準備
まず Dockerfile 作成。
jwilder/dockerize を使って、s3cmd が読み込む設定ファイル ~/.s3cfg
を生成しています。
$ vi Dockerfile
FROM ubuntu
RUN apt-get update && apt-get install -y wget s3cmd
ENV DOCKERIZE_VERSION v0.3.0
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
ADD dot.s3cfg.tmpl /root/.s3cfg.tmpl
ENTRYPOINT ["dockerize", "-template", "/root/.s3cfg.tmpl:/root/.s3cfg", "s3cmd"]
WORKDIR /work
設定ファイルのテンプレ作成。
$ vi dot.s3cfg.tmpl
[default]
access_key = {{ .Env.ACCESS_KEY }}
secret_key = {{ .Env.SECRET_KEY }}
host_base = jp-east-2.os.cloud.nifty.com
host_bucket = %(bucket)s.jp-east-2.os.cloud.nifty.com
docker イメージをビルドしておく。
$ docker build -t s3cmd .
(略)
Successfully built d128c83ccaeb
あとは、s3cmd にエイリアスを設定しておく。
(定常的に使う場合には ~/.bashrc
等に書いておくといいかも。)
$ alias s3cmd="docker run \
-ti --rm -v $(pwd):/work \
-e ACCESS_KEY=${YOUR_ACCESS_KEY} \
-e SECRET_KEY=${YOUR_SECRET_KEY} \
s3cmd"
動作確認
ここまでやると、ホストに s3cmd をインストールしてなくてもコンテナ経由で s3cmd が使えるようになっている。
バケットの作成。
$ s3cmd mb s3://tily
Bucket 's3://tily/' created
2017/02/10 04:09:15 Command finished successfully.
バケットの一覧。
$ s3cmd ls
2017-02-10 03:52 s3://tily
2017/02/10 04:09:33 Command finished successfully.
s3cmd コンテナは -v $(pwd):/work
で起動するので、カレントディレクトリだったらファイルのアップロード・ダウンロードもできる。
ファイルのアップロード。(微妙に変なエラーが出たけどなんだろう。)
$ echo hello world > test.txt
$ s3cmd put test.txt s3://tily/test.txt
WARNING: test.txt: Owner username not known. Storing UID=500 instead.
WARNING: test.txt: Owner groupname not known. Storing GID=500 instead.
upload: 'test.txt' -> 's3://tily/test.txt' [1 of 1]
12 of 12 100% in 0s 354.82 B/s done
upload: 'test.txt' -> 's3://tily/test.txt' [1 of 1]
12 of 12 100% in 0s 228.68 B/s done
2017/02/10 04:11:38 Command finished successfully.
ファイルのダウンロード。
$ s3cmd get s3://tily/test.txt test2.txt
download: 's3://tily/test.txt' -> 'test2.txt' [1 of 1]
download: 's3://tily/test.txt' -> 'test2.txt' [1 of 1]
12 of 12 100% in 0s 528.98 B/s done
2017/02/10 04:12:35 Command finished successfully.
$ cat test2.txt
hello world
まとめ
あまりコンテナを意識せずにホスト側から s3cmd が使えるようになって便利になった。あとあまり関係ないけど、dockerize はテンプレ機能だけでなく、別のコンテナの TCP ポートが LISTEN するまで待ってくれる機能 もあるようなので、こちらも今度試してみたい。