Dockerに出てくるcowsayってなに？

## はじめにのはじめに / 20190207追記

このQiitaの記事も、だいぶ古くなりました！
最終更新が2015年11月なので、3年以上前のお話ですね....。その間に、Dockerを巡る技術も非常に変わりまして、最初のころに試させていただいたチュートリアルやcowsayも公式サイトからはリンク切れになってしまった模様。
（どうやら、サンプルのイメージはnginxが利用されているようです）

せっかくなので、cowsayのイメージはまだDockerHubにあるかどうか確認したところ、2000件以上はヒット。

- https://hub.docker.com/search?q=cowsay&type=image
 - ただし、Docker OfficialとかVerifiedなイメージに絞り込むと0件になるのが、なんとも可笑しい感じがします 

このcowsayのDocker image、久しぶりに試してみたくなったのですが、わざわざpullするのもちょっと面倒なので、今回の追記に合わせて、[Play with Docker](https://labs.play-with-docker.com)(略してPWD) 上で動かしてみます。

![20190207-cowsay-on-pwd.png](https://qiita-image-store.s3.amazonaws.com/0/27976/1d173b70-f0bf-bea6-e5ba-ffe607501406.png)

**PWD**では、ブラウザだけでDockerのイメージを起動させたり、クラスタを試せたりできる素敵な環境です。
（ただし、機密情報や見られてまずいものは、ここではアップしたりしないこと！あくまで揮発性、Sandboxとしてご利用ください）

ということで、３年ぶりに牛さんに再会できました。
もし、古い記事ですがご興味がありましたら、以下をお読みいただければ幸いです。

### はじめに

[Dockerのチュートリアル](http://docs.docker.com/mac/step_three/)のページには **whalesay** や **cowsay** と言ったキーワードが出てきます。

文字通り、「クジラがなにか言う」のだとは想像できますし、実際にDockerを起動するとお馴染みのクジラのアスキーアートが出てきます。

おそらくこのことだろうとは思いますが、せっかくなのでネタとして調べることにしてみました。


### cowsayってなに?

[Dockerのチュートリアル](http://docs.docker.com/mac/step_three/)にあるサンプルでは、このようなコマンドを打ちます。

```
% docker run docker/whalesay cowsay boo
Unable to find image 'docker/whalesay:latest' locally
latest: Pulling from docker/whalesay
.... [ 中略 ] ....

 _____ 
< boo >
 ----- 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/   

```

実行の結果、「boo」と言っているようなクジラのアスキーアートが表示されました。
つまり、run で、cowsayというコマンドに「boo」という引数を渡して実行させるというわけですね。（ただし、cowではなくて、whaleがセリフを言っていますが）

では、このcowsayって何でしょう？

>『「cowsayとは、メッセージをつぶやくウシのアスキーアートを生成するプログラムである。』（Wikipedia:[cowsay](https://ja.wikipedia.org/wiki/Cowsay)　より引用）

どうやら、Docker専用ではなく、だいぶ昔からある由緒あるコマンドのようです。

### オプションを付けて実行してみよう！

cowsayが使えるということは、[Wikipedia](https://ja.wikipedia.org/wiki/Cowsay) の解説にあるように、オプションも付けて実行できそうです。

早速 -l オプションで利用可能なcow(動物、キャラクター）をリストアップしてみます。
どうやら、**docker** もいるようです。

```
$ docker run --rm -i docker/whalesay cowsay -l

/usr/local/share/cows:
beavis.zen bong bud-frogs bunny cheese cower daemon default docker dragon
dragon-and-cow elephant elephant-in-snake eyes flaming-sheep ghostbusters
head-in hellokitty kiss kitty koala kosh luke-koala meow milk moofasa moose
mutilated ren satanic sheep skeleton small sodomized squirrel stegosaurus
stimpy supermilker surgery telebears three-eyes turkey turtle tux udder
vader vader-koala www

```

### アスキーアートを変えてみよう！

オプションで、出力される動物を上記にリストアップしたものに変更できます。
特に指定が無い場合、この docker/whalesay のイメージだとクジラが出てきますので、おそらく -f default だとクジラなはず。

```
$ docker run --rm -i docker/whalesay cowsay -f default hello!
 ________ 
< hello! >
 -------- 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/   
```

上記のように、やっぱりクジラがでました！

[Dockerfile](https://hub.docker.com/r/docker/whalesay/)にも、確かにそのようにデフォルトをwhaleに向けている記述がありますね。

```
COPY docker.cow /usr/share/cowsay/cows/
RUN ln -sv /usr/share/cowsay/cows/docker.cow /usr/share/cowsay/cows/default.cow
```

### vaderがいるぞ！

なんとcowsayの中には、vaderとかlukeっぽいものがあります！
これは試してみるしかありません！

『そうではない。私がお前の父親だ』で実行！

```
$ docker run --rm -i docker/whalesay cowsay -f vader "No, I am your Father.."
 ________________________ 
< No, I am your Father.. >
 ------------------------ 
        \    ,-^-.
         \   !oYo!
          \ /./=\.\______
               ##        )\/\
                ||-----w||
                ||      ||

               Cowth Vader
```

『Yes, master.』はどう？

```             
$ docker run --rm -i docker/whalesay cowsay -f vader-koala "Yes master."
 _____________ 
< Yes master. >
 ------------- 
   \
    \        .
     .---.  //
    Y|o o|Y// 
   /_(i=i)K/ 
   ~()~*~()~  
    (_)-(_)   

     Darth 
     Vader    
     koala        
```

『父さん、助けて！』はどう？

```
$ docker run --rm -i docker/whalesay cowsay -f luke-koala Father, please, help!
 _______________________ 
< Father, please, help! >
 ----------------------- 
  \
   \          .
       ___   //
     {~._.~}// 
      ( Y )K/  
     ()~*~()   
     (_)-(_)   
     Luke    
     Sywalker
     koala 
```

### イメージの中に入ってみよう！

なかなか面白かったので、イメージの中に入ってcowファイルを眺めてみます。
（cowsay自体は、perlで書かれたスクリプトになっています）

```
# イメージの中に入ってみます
$ docker run --rm -i -t docker/whalesay bash

# cowファイルのある場所に異動
root@d17e90b906c6:/cowsay# cd /usr/local/share/cows   
root@d17e90b906c6:/usr/local/share/cows# ls
beavis.zen.cow      dragon.cow             koala.cow       satanic.cow      telebears.cow
 
# --- [ たくさんあるので略 ] ---

# 一番サイズの小さい、bunnyを表示してみます
root@d17e90b906c6:/usr/local/share/cows# cat bunny.cow 
##
## A cute little wabbit
##
$the_cow = <<EOC;
  $thoughts
   $thoughts   \\
        \\ /\\
        ( )
      .( o ).
EOC

```

$thoughts　のところにメッセージが入る模様。このフォーマットでファイルを作れば、いろいろできそうです。

以上、Dockerからつい脱線してしまいましたが、自作のcowファイルを入れてイメージを配布するのも楽しそうですね^^