近デジダウンローダーはRubyで書かれていて,その実装にあたってはNokogiriやImageMagickなど,いろんなライブラリが使われていて,その利用にあたってはインストールに失敗してはエラーメッセージでググって勘で対応する,みたいなことがよくおこなわれている.
僕もたまに動かそうとするとなんか壊れたりしてて,こんなことで悩みたくないので難しかった.
…という課題感が以前からあって,Dockerで動くようになればポータビリティが上がってセットアップしやすくなってよさそうと思ったのでやってみた.
docker run hitode909/kindairb で動く
Dockerをインストール済なら以下の1コマンドで動く.
ワーキングディレクトリに柳田国男編,桃太郎の誕生がダウンロードされるはず.簡単.
docker run --rm --volume "$PWD":/workdir hitode909/kindairb http://dl.ndl.go.jp/info:ndljp/pid/1062590
ファイルをダウンロードしてくれる君をDockerでどう扱うか
お手元のパソコンの画像ビューワーで画像を見るためにダウンロードしているので,コンテナの内側で保存してもあまり意味なくて,そこからなんとかして外側に取り出す必要がある.
という形でうまくいった.gccのDockerイメージも以下のような形になっている.
$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp gcc:4.9 gcc -o myapp myapp.c
動かしたいアプリケーションどうやって入れるか
軽く眺めたところ,git cloneして動かすパターンや,gem install bundlerしてbundle execして動かすパターンなどあった.
もともとRubyGemsに置いてたので,gem installするだけでインストールできた.
FROM ruby:2.4.0 RUN gem install kindai VOLUME /workdir WORKDIR /workdir ENTRYPOINT ["kindai.rb"]
kindairb/Dockerfile at master · hitode909/kindairb · GitHub
VOLUMEとWORKDIR
気になってるのが,VOLUMEとWORKDIRは起動時に毎回書いてもらえれば,Dockerfile側で書かなくてもよいかもしれない.
ここからさらにイメージを拡張して,毎回決まった本をダウンロードして配ってくれるイメージを作りたい,というユースケースでは,VOLUMEとWORKDIRはここに書いてある必要ないはず.
しかし,これを指定せずに動かすと,いきなり/にファイルがダウンロードされるのでよろしくなさそう.
昔の本を読みたいだけの普通の人の手元にいろんなライブラリを入れていくのはさすがにちょっと…という感じがして気になっていたので,1コマンドで動くようになってよかった.
一方で,Dockerを手元に入れて動かすだけでちょっと概念的には難しいことをしているので,別の問題にすりかわっているだけな気もする.
もうちょっと動かしやすくするには,JSで書き直してElectronでGUIアプリにして配布することなどが考えられるけど,フルスクラッチすることになり大変そう.