目的
あるバッチ処理を行うDockerコンテナで生成するCSVファイルをS3と同期したかったのでs3fsを使うことにしました。コンテナ自体にs3fsを入れてしまうのも一つの方法ですが、役割を分割するためにs3fs用の別コンテナを用意する形にしました。
最初思いついた方法がvolumes_fromオプションでディレクトリを共有する方法だったのですが、s3fsはFUSEファイルシステムをベースにしており、volumes_fromオプションはFUSEのマウントに対応していないためこの方法は断念しました。
Docker Hubで既に存在するイメージを検索してみたところ、以下のイメージが存在し共有マウントを使用する方法が載っていたため、こちらの方法に従ってやってみることにしました。
https://hub.docker.com/r/xueshanf/s3fs/
環境
- OS: Amazon Linux AMI release 2016.03
- Docker: 1.11.1
- Docker Compose: 1.7.1
事前にDockerとDocker Composeをインストールしておきます。
yum update -y
yum install -y docker
curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
service docker start
手順
共有マウントの設定
# mkdir /mnt/mydata
# mount --bind /mnt/mydata /mnt/mydata
# mount --make-shared /mnt/mydata
# findmnt -o TARGET,PROPAGATION /mnt/mydata
TARGET PROPAGATION
/mnt/mydata shared
s3fsの設定
s3fs用のAWSのキー設定のファイルを作成しておきます。
# echo "<accessId>:<acessSecrect>" > /root/.s3fs
# chmod 600 /root/.s3fs
docker-compose.ymlの作成
docker-composeの定義を用意します。
version: '2'
services:
app:
image: busybox
volumes:
- /mnt/mydata:/mnt
s3fs:
image: xueshanf/s3fs:latest
environment:
AWSACCESSKEYID: <accessId>
AWSSECRETACCESSKEY: <acessSecrect>
cap_add:
- MKNOD
- SYS_ADMIN
security_opt:
- apparmor:unconfined
devices:
- /dev/fuse
volumes:
- /mnt/mydata:/mnt:shared
- /root/.s3fs:/root/.s3fs
command: /usr/bin/s3fs -f -o allow_other -o use_cache=/tmp -o passwd_file=/root/.s3fs docker-s3fs-test /mnt/
s3fs用のコンテナとapp用のコンテナとなります。
s3fsコンテナを起動
# docker-compose run -d s3fs
※共有マウントが有効でないと言われてしまう場合は、一度Docker Daemonを再起動して再度試してみてください
ホストマシンでS3マウントが有効かどうかを確認
まずはホスト側でS3がマウントされているかどうかを確認してみます。マウントディレクトリでファイルを作成します。
# touch /mnt/mydata/hello
S3 Bucketの中を確認するとファイルが追加されていることを確認できます。
# aws s3 ls s3://docker-s3fs-test
2016-07-04 05:55:59 0 hello
appコンテナ内でS3マウントが有効かどうかを確認
appコンテナを起動して、マウントディレクトリにファイルを追加してみます。
# docker-compose run --rm app touch /mnt/world
S3にファイルが追加されていることを確認できます。
# aws s3 ls s3://docker-s3fs-test
2016-07-04 05:55:59 0 hello
2016-07-04 05:57:56 0 world