febc技術メモ

Japanese version of http://febc-yamamoto.hatenablog.com

パッケージ管理ツール「whalebrew」〜透過的にDocker上でコマンドを実行する環境を作る〜

「whalebrew」という素晴らしいプロダクトが出ていました。

github.com

Homebrewのような感じでコマンドをインストールし、かつそのコマンドをDocker上で実行できるように環境を整えてくれるツールです。

# whalebrewコマンドで"whalesay"コマンドをインストールしてみる
$ whalebrew install whalebrew/whalesay

# DockerHubからイメージのダウンロードが行われる
Unable to find image 'whalebrew/whalesay' locally
Using default tag: latest
latest: Pulling from whalebrew/whalesay
e190868d63f8: Extracting [=======================>                           ] 30.64 MB/65.77 MB
909cd34c6fd7: Download complete 
0b9bfabab7c1: Download complete 
a3ed95caeb02: Waiting 
00bf65475aba: Waiting 
c57b6bcc83e3: Waiting 
8978f6879e2f: Waiting 
8eed3712d2cf: Waiting 

# ダウンロードしたイメージを実行できるように、/usr/local/bin配下にエイリアスが作成される
# 最終的に以下のようなコマンドでDocker上で実行されることになる
# docker run -it -v "$(pwd)":/workdir -w /workdir $IMAGE "$@"

?  Installed whalebrew/whalesay to /usr/local/bin/whalesay

# インストールしたコマンドは作成されたエイリアスを通じ実行できる
$ whalesay 'hello'
 _________ 
< hello!! >
 --------- 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/   

以下、簡単に使い方などをメモしておきます。

インストール

今の所はWindowsは非対応のようです。Linux/Macなら動くと思います。
以下のようにバイナリをダウンロードして実行権を付与するだけです。

curl -L "https://github.com/bfirsh/whalebrew/releases/download/0.0.1/whalebrew-$(uname -s)-$(uname -m)" -o /usr/local/bin/whalebrew; chmod +x /usr/local/bin/whalebrew

使い方

コマンドのインストール

$ whalebrew install オーガニゼーション/イメージ名

オーガニゼーション/イメージ名にはDockerHub上のものを指定します。

f:id:febc_yamamoto:20170127080905p:plain

検索

検索は現状ではwhalebrewオーガニゼーション配下のイメージに対してのみ有効みたいです。

$ whalebrew search イメージ名

whalebrewでインストール済みのコマンド一覧表示

$ whalebrew list

更新(upgrade)

$ whalebrew upgrade オーガニゼーション/イメージ名

動作設定

現在はエイリアスを作成する先のディレクトリを変更できるようです。
デフォルトは/usr/local/binですが、以下の環境変数で変更可能です。

WHALEBREW_INSTALL_PATH

パスの通ったディレクトリを指定しましょう。

内部動作

コマンドをインストールすると、WHALEBREW_INSTALL_PATH(デフォルト/usr/local/bin)配下に以下のようなファイルが作成されます。

例: whalebrew/whalesayコマンドをインストールした場合

#!/usr/bin/env whalebrew
image: whalebrew/whalesay

これを実行すると、以下のようなDockerコマンドが(whalebrewを通じて)実行されます。

docker run -it -v "$(pwd)":/workdir -w /workdir $IMAGE "$@"

注意点は、dockerでのWORKDIR/workdirに固定となっている点です。
コマンド実行時のカレントディレクトリの内容がコンテナ内の/workdirにボリュームとして割り当てられます。
なお、後述しますが、Dockerイメージ側でラベルが指定されている場合はこのパスが変更できるようです。

注:dockerクライアント実行環境にもよりますが、~/配下など、コンテナにバインドマウント可能なディレクトリでないとコマンド実行できないっぽいですね。

公開するイメージの作り方

以下の2つの条件を満たすだけです。

  • DockerHub上に公開すること
  • イメージにENTRYPOINTが設定されていること

以下のLABELをイメージに設定(Dockerfileに記述)しておくことで、動作のカスタマイズができるようです。

io.whalebrew.name : whalebrewでインストールした場合のコマンド名。デフォルトではイメージ名となる。

io.whalebrew.config.environment : コンテナに渡す環境変数。以下のように指定する。

# コマンド実行時に$TERMと$FOOBAR_NAMEを引き渡しする(-eオプション)
LABEL io.whalebrew.config.environment '["TERM", "FOOBAR_NAME"]'

io.whalebrew.config.volumes : コンテナに割り当てるボリューム。以下のように指定する。

# ~/.dockerをコンテナの/root/.dockerに読み取り専用で割り当て(-vオプション)
LABEL io.whalebrew.config.volumes '["~/.docker:/root/.docker:ro"]'

まとめ

これまでDockerイメージで配布されていたアプリの場合、whalebrewを使えば楽に配布〜実行設定できますね。
dockerコマンドを直接叩いてもらわなくてよくなる、aliasを張る必要がなくなるなど嬉しいですね!
ぜひ流行って欲しいところです。

公開されたばかりのプロダクトですのでバグもあるかと思いますが積極的に使っていきたいです。

以上です。 Enjoy!!