じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

君がDockerで何やってるか知りたい。だって、好きだもん!!!

概要

Dockerは、コンテナ内のプロセスを分離するための柔軟なツールでオシャレな都会のエンジニアはみんな使っています。福岡の田舎っぺ学生エンジニアすら注目しているので多分、相当に人気があるのだと思います。そんな、Dockerのファイルの変更監視をしてみたいと思います。

ファイルの変更監視

コンテナ内で変更されたすべてのを元のイメージからと比較して作成、変更、削除したファイルを知ることができる~。

$docker run --name my_container --detach ubuntu sleep 3000

実行されているか確認せよ!!!

$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
4577d24ac658        ubuntu              "sleep 3000"        About a minute ago   Up About a minute                       my_container

sleep 3000が実行されていることが分かるけん次に変更確認をします。

変更確認

次にファイルが変更されていないことを確認してみましょう。

$ docker diff my_container

ファイル作成

次にファイルの作成を行います。

$sudo docker exec my_container touch /tmp/nwiizo

diffで変更の差分を見てみます。

$docker diff my_container
C /tmp
A /tmp/nwiizo

コピー

docker cpを使ってホストにコピーしてみましょう。

$docker cp my_container:tmp/nwiizo ./nwiizo
$ls
nwiizo

ファイルをコピーできました。やったね♥

手動で行うのはばり面倒やけんこのプロセスはできれば自動化したいっちゃん。定期的にdiffをとってシェル芸を回すという手段もあるけんがバリダサい!!!-vで共有ボリュームを使ったほうがN倍マシやな!!!

監視したい!!!

pyinotifyとは

既存のおしゃれツールを使いましょう!!!pyinotifyとは、ファイルなどの変更を監視するためのPythonモジュールです。しかし、pyinotifyはinotifyと呼ばれるLinuxカーネル機能に依存しています。inotifyに関しては任意のおページを見て確認してくれ!!!

Linuxでの監視は以下を参照してください!!!

syu-m-5151.hatenablog.com

インストール

$sudo pip3 install pyinotify

はい、簡単()。

では、pyinotifyスクリプトで共有ボリュームにあるファイルを監視しましょう。 -vオプションについて少し説明しておくとまぁ共有ボリュームを作成するオプションです。Dockerはすぐにデータがどっかーんと消えてしまうので共有ボリュームを使って少しはマシにしましょうねという話です。

$sudo docker run --name my_container --detach -v "$(pwd)/paipai:/app" ubuntu sleep 3000

$(pwd)は現在のディレクトリでその下に/paipaiというコンテナを作成しコンテナ内の/appというディレクトリと共有ボリュームを持つという意味です。

監視用のスクリプトを以下に示す。後でGithubとかにもあげておいて上げます。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-ss

import pyinotify
import subproce

# 監視したいローカルのディレクトリです。
watch_dir = '($pwd)/paipai'

def Change_file(ev):
    cmd = ['/bin/echo', 'File', ev.pathname, 'changed']
    subprocess.Popen(cmd).communicate()

wm = pyinotify.WatchManager()
wm.add_watch(watch_dir, pyinotify.IN_CLOSE_WRITE, Change_file)
notifier = pyinotify.Notifier(wm)
notifier.loop()

別窓を開いて監視用のスクリプトを回してみましょう

$python3 watch.py

そしたらばファイルを追加してみましょう!!!

$docker exec -it my_container touch /app/oppai
$ls paipai/
oppai

共有ボリュームなのでpaipaiの下にファイルがあることが確認できます。

さっき、動かしたスクリプトから

$python3 
File /home/nwiizo/docker/paipai/oppai changed

任意のファイルが作成されていることが分かります。監視できてるね!!!後は煮るなり焼くなり自由なり!!!

最後に

やったゾ!!!ファイルの作成が検出できました。既存のファイルの変更にも対応しているので大丈夫です。 Dockerのネットワークの取り組みは面白くその他にも遊ベるものがたくさんあります。

参照

Docker ドキュメント日本語化プロジェクト — Docker-docs-ja 1.12.RC ドキュメント

Home · rvoicilas/inotify-tools Wiki · GitHub