ローカルに無いコマンドをdockerを使って実行

  • shusatoo
  • 2015-06-12 16:05

docker操作がまだまだおぼつかない佐藤です。
ローカルにインストールしたくはないけど、試してみたいコマンド(ソフトウェア)がある時ってありませんか。
そのような場合に、手軽にdockerの恩恵に預かれる機会があったのでまとめてみました。

やりたいこと

ローカルに無いコマンドを、ローカルにインストールすること無く、dockerを使って実行できるようにしたい。
今回は、markdown-pdf というソフトウェアの markdown-pdf コマンドを、
ローカルにインストールせずに、dockerを使って実行できるようにします。

環境

Fedora22に、dockerをインストール済みです。

ローカルにインストールする場合

markdown-pdfを普通にインストールする場合

$ npm install -g markdown-pdf

と実行するだけなのですが、自分の環境にはそもそもnpmが入っていません。
npmをインストールしようとすると、大量の依存パッケージが入ることになるので、ちょっとインストールしたくない気分。
いや別にインストールしてもいいんだけどさ。

npmの依存パッケージ

ちなみにこんな感じでした。93 Packages。

$ sudo dnf install npm
========================================================================================================
 Package                            アーキテクチャ
                                                バージョン                           リポジトリー  容量
========================================================================================================
インストールしています:
 c-ares-devel                       x86_64      1.10.0-4.fc22                        fedora        76 k
  ~~~ (snip) ~~~
 v8                                 x86_64      1:3.14.5.10-18.fc22                  fedora       3.0 M
 v8-devel                           x86_64      1:3.14.5.10-18.fc22                  fedora        75 k

トランザクションの要約
========================================================================================================
インストール  93 Packages

総ダウンロード容量: 17 M
インストール済み容量: 50 M
これでいいですか? [y/N]N
Operation aborted.
$

というわけで、ローカルインストール無しにdockerを使ってmarkdown-pdfが使えるようにしていきます。

Dockerfileを書く

markdown-pdfが使える環境のdockerイメージが構築されるようにします。

Dockerfile

FROM node:latest
RUN npm install -g markdown-pdf
ENTRYPOINT ["/usr/local/bin/markdown-pdf"]

nodeのパプリックイメージを元に、markdown-pdfをインストールします。
ENTRYPOINTに、インストールされたmarkdown-pdfへのパスを指定することで、
docker run時の引数がmarkdown-pdfへの引数になります。

ビルドする

ビルドします。イメージ名は適当に local/markdown-pdf としました。

$ sudo docker build -t local/markdown-pdf .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon
  ~~~ (snip) ~~~
Removing intermediate container 5dddbc6c4873
Successfully built b98713d95d5d

local/markdown-pdf イメージがビルドされていることを確認。

$ sudo docker images
REPOSITORY                      TAG                 IMAGE ID
 CREATED             VIRTUAL SIZE
local/markdown-pdf              latest              b98713d95d5d
 37 seconds ago      775.8 MB
docker.io/node                  latest              579b8488f17a
 5 days ago          711 MB
$

コマンド実行確認

とりあえず docker run してみます。

$ sudo docker run --rm local/markdown-pdf

  Usage: markdown-pdf [options] <markdown-file-path>

  Options:

    -h, --help                               output usage information
    -V, --version                            output the version number
    <markdown-file-path>                     Path of the markdown file
to convert
    -c, --cwd [path]                         Current working directory
    -p, --phantom-path [path]                Path to phantom binary
    -h, --runnings-path [path]               Path to runnings (header, footer)
    -s, --css-path [path]                    Path to custom CSS file
    -z, --highlight-css-path [path]          Path to custom highlight-CSS file
    -m, --remarkable-options [json-options]  Options to pass to remarkable
    -f, --paper-format [format]              'A3', 'A4', 'A5',
'Legal', 'Letter' or 'Tabloid'
    -r, --paper-orientation [orientation]    'portrait' or 'landscape'
    -b, --paper-border [measurement]         Supported dimension units
are: 'mm', 'cm', 'in', 'px'
    -d, --render-delay [millis]              Delay before rendering the PDF
    -t, --load-timeout [millis]              Timeout before the page
is rendered in case `page.onLoadFinished` isn't fired
    -o, --out [path]                         Path of where to save the PDF

上手くいきました。

ローカルファイルを引数にしてコマンド実行

ローカルファイルを引数にしてコマンド実行するために、

  • ローカルのファイルをコンテナに渡すために、-vでカレントディレクトリをコンテナの/tmpにマウント
  • ENTRYPOINTの引数にカレントディレクトリのファイル名を渡す(今回はtest.mdファイル)を渡す

上記の内容で docker runします。

docker run

今回はカレントディレクトリの test.md を引数にして、 markdown-pdf コマンドを実行しました。

$ sudo docker run --rm -v `pwd`:/tmp local/markdown-pdf /tmp/test.md

実行結果

pdfができました。

$ ls // 実行前
Dockerfile test.md
$ ls // 実行後
Dockerfile test.md test.pdf

まとめ

結構お手軽な作業で、ローカルインストール無しに新しいコマンド(ソフトウェア)を試せます。
機会があればご参考ください。