ローカルでの作業もDockerでやろう

Posted by rhoboro on 2017-02-04

ただの個人的なメモです。
Markdown => HTMLへの変換作業をするのに、ローカル環境に諸々インストールしたくなかったのでDockerを使ったよという話。

動機

  • iOSアプリでOSSライセンスページを作るのに、CocoaPodsのmarkdownをhtmlに変換したかった。
  • ビルドに使ってるマシンは別アプリでも使ってるから極力環境を変えたくない。
  • Androidアプリのビルド用にDocker環境は用意してた。

というような理由で、今までローカルでやってた作業をDockerでできないかなーと思い試しに作りました。

作ったもの

公式の手順そのままです。 こちらに置いてます。

cloneして下記のコマンドを実行するだけでカレントディレクトリのmarkdownをhtmlに変換してくれます。

$ docker build -t convert:0.1 .
$ docker run --rm -v `pwd`:/usr/src/app -w /usr/src/app convert:0.1

DockerでPythonを動かすところの解説

公式Pythonイメージの中にあるpython:3-onbuildは、requirements.txtを解釈して、依存ライブラリがインストールされたDocker Imageをビルドしてくれます。
なので、依存しているライブラリ(今回だとmarkdown)はそこに記載します。

あとは、ビルドしたDocker Imageを走らせるだけです。
ゴミがたまらないよう--rmオプションで実行後すぐ削除してます。 また、-vオプションでホストのカレントディレクトリをマウントさせることで、ホストのファイルの読み書きをできるようにしています。
-wはなくても動くけど、公式で説明されてるコマンドでは記載されてるので念のため。(ワーキングディレクトリを決めるオプション)

markdown.markdownFromFile

初めてmarkdownFromFileを使いましたが、とても便利でしたので少し紹介を。

今回、markdownをhtmlに変換してるのはconvert.pyのこの部分です。

def convert(files):
    for f in files:
        name, ext = os.path.splitext(f)
        markdownFromFile(f, output='{0}.html'.format(name))

最初はとりあえず動かすために作ったので、下のようにread()を使ってました。

def convert(files):
    for f in files:
        with open(f, 'r') as src:
            html = markdown.Markdown().convert(src.read())
        name, ext = os.path.splitext(f)
        with open('{0}.html'.format(name), 'w') as dst:
            dst.write(html)

でもこれだとsrc.read()でメモリを食っちゃうので、変換が動くことを確認した後はredline()を使う方向に舵きり。
でも調べるとmarkdown.markdownFromFile()が提供されていたので、これが一番安心だと思って再度舵きり。 ファイルのオープンも中でやってくれるので、ファイル名を渡すだけで超楽チンでした。

(まぁローカルでやるならそもそもこの1行で済む話ですw

$ python -m markdown input.txt > output.html

最後に

Dockerほんと便利ですね。 個人的に不要になったものはどんどん消していきたいタイプなので、Dockerだと「とりあえず入れてみる」が気軽にできてとてもいいです。
今回はシンプルなファイル変換をしていますが、convert.pyの部分を好きに変えるだけで、これまでローカルでやっていた作業を簡単にDocker内に移行できますね。

tags: Docker, Python