Dockerコンテナを気楽に扱う

#対象
dockerで開発環境作っているけど、長ったらしいコマンドに嫌気がさしている人。
もしくは逆にあらゆるコマンドをdockerで提供されたら良いのにと思っている人。

#きっかけ
bundle時代はaliasを駆使して`ber` で`bundle exec ruby` 、`beer` で`bundle exec rails`などと出来ていたがdockerを使うようになって以下のようにaliasだけでは上手く行かなくなりました。

- `docker-compose run --rm web rails`がwebだったり、appだったり。
- `docker --rm -it -v $pwd:/myapp -w /myapp ruby rails`がmyappだったり別の場所だったり。

ということで、毎回手打ちになるのですが、非常につらい。
もうディレクトリを認識して勝手にサービス名だのマウント場所だのを追加してくれないかと考えていたらrbenvのlocalコマンドが似た感じだと気が付いて、いっちょ作ってみるかと思い至りました。

あと、golangを弄りたくて、ネタ探しという側面も・・・。 

#成果物
https://github.com/nak1114/dcenv

##使い方

例としてgoコマンドを実行するまでです。

#### 1. インストールして

```bash
    $ dcenv install golang
```
#### 2. デプロイして

```bash
    $ dcenv local golang
    $ dcenv rehash
```
#### 3. コマンド実行

```bash
    $ go version
    go version go1.8 linux/amd64

```

これだけ。

### 環境切り替え

#### バージョン切り替え

```bash
    $ dcenv tag golang:1.7
    $ go version
    go version go1.7.5 linux/amd64

```

#### ディレクトリによる切り替え

`local`を実行した子孫のディレクトリのみで実行可能です。

```bash
    $ mkdir child
    $ cd child
    $ go version
    go version go1.7.5 linux/amd64
    
    $ cd ../../
    $ go version
    bash: go: command not found

```

## インストール方法

### Linux(Bash)

.bashrcに環境変数を書いてリロードします。

```bash:.bashrc
    export DCENV_HOME=~/.dcenv
    export PATH=${DCENV_HOME}/shims;${DCENV_HOME}/bin;${PATH}
```

ファイルをダウンロードして展開します。

```bash:bash
    $ wget --no-check-certificate https://github.com/nak1114/dcenv/releases/download/v0.0.4/dcenv-v0.0.4-linux-amd64.tar.gz

    $ mkdir -p $DCENV_HOME
    $ tar xvfz dcenv-v0.0.4-linux-amd64.tar.gz -C $DCENV_HOME
```


### Windows

コンパネから環境変数を変更して、コンソールを再起動します。

| 環境変数          |        値 |
|:-----------------|:------------------|
| DCENV_HOME       | %USERPROFILE%\\.dcenv |
| PATH             | 既存のPATHの先頭に %USERPROFILE%\\.dcenv\shims; %USERPROFILE%\\.dcenv\bin;を加える|


以下のファイルをダウンロードしてDCENV_HOME下に解凍する。
https://github.com/nak1114/dcenv/releases/download/v0.0.4/dcenv-v0.0.4-windows-amd64.zip

```cmd
    > powershell Expand-Archive dcenv-v0.0.4-windows-amd64.zip  -DestinationPath %DCENV_HOME%
```



## その他コマンド

dcenvの状態を知るためにいくつかのコマンドがあります。



### レジストリに登録されているコマンド(イメージ名)一覧

```bash:
    $ dcenv install --list
    golang           
    naktak/clang     
    naktak/dcenv_test
```

#### インストールされたコマンド(イメージ名)一覧

```bash:
    $ dcenv yard --list
    golang           
```

#### 現在のディレクトリで実行可能なコマンド一覧

```bash:
    $ dcenv command --list
    COMMAND   | IMAGE        (FILE)
    go        | golang       (/tmp/hoge/.dcenv_bash)
```

#### インストールされたコマンド(イメージ名)詳細

```bash:
    $ dcenv yard golang
    ---[ 0 ]---------                                                                                     
      Id      :                                                                                           
      Owner   :                                                                                           
      Image   : golang                                                                                    
      Brief   : golang for go command                                                                     
      Desc    :                                                                                           
      Pri     : 0                                                                                         
      Config  : bash                                                                                      
        Tag     :                                                                                         
        Fake    : false                                                                                   
        Commands: map[go:map[]]                                                                           
        Script  :                                                                                         
    docker run --rm -it -v "$(pwd)":/myapp -w /myapp golang:{{.Tag}} go "$@"                              
                                                                                                          
      Config  : windows                                                                                   
        Tag     :                                                                                         
        Fake    : false                                                                                   
        Commands: map[go:map[]]                                                                           
        Script  :                                                                                         
    docker run --rm -it -v %CD%:/myapp -w /myapp -e GOOS=windows -e GOARCH=386 golang:{{.Tag}} go %*      
    
```

#### 現在のディレクトリで実行されるコマンドの詳細

```bash:
    $ dcenv command go
    ---[ go ]------------------------------
    (略)
    
```


## 新規コマンド作成方法

未だレジストリには殆どコマンドがありません。
しかし、あなた自身で新しいコマンドを作り、レジストリに登録することが出来ます。
ここではbusyboxイメージを利用した`ls`コマンドと`cat`コマンドを登録する方法を例示します。

### コマンドのテンプレートを作成

```bash:
    $ dcenv yard --create busybox
    Edit: ~/.dcenv/image_yard/busybox.yml
```
作成されたテンプレートファイル名が表示されます。

### テンプレートを編集

```bash:
    $ vi ~/.dcenv/image_yard/busybox.yml
```

テンプレートファイルの詳細は[GitHub上のDoc](https://github.com/nak1114/dcenv/blob/master/docs/script.md)を参照。
若しくは `dcenv install naktak/dcenv-script-sample`がわかりやすいです。

### 作成したコマンドをチェックする

```bash:
    $ dcenv local busybox
    $ dcenv rehash
    $ ls
```

### レジストリにユーザー登録する。(初回のみ)

GitHub上の登録画面( https://nak1114.github.io/dcenv/index.html )の‘Sign Up‘から登録する。
’Sign Up’を押すと登録したメールアドレスに確認メールが届きますので、メールに記載されているURLをクリックして登録完了です。

### コマンドをレジストリに登録する。

```bash:
    $ dcenv push busybox
```


### レジストリからログアウトする。

```bash:
    $ dcenv logout
```

### 登録したコマンドをレジストリから削除する。
間違えて登録したコマンドは削除できます。自分で登録したコマンド以外はレジストリから削除できません。

```bash:
    $ dcenv push -d busybox
```

## dcenvのコマンドチートシート

![Command cheat sheet](https://nak1114.github.io/dcenv/DCEnv_CheatSheet.png)

#Go言語所感

Go言語の宣伝されている特徴として以下があると思います。

- クロスプラットフォーム開発が容易である
- 並列化が容易である
- 高速なサーバサイドが構築できる
- マスコットが可愛い

`並列化`に関しては依然作った[これ](http://qiita.com/nak1114/items/8cc97fa405be14a34181)を移植するのが早いので、今回は`クロスプラットフォーム開発`と`高速なサーバサイド`を目標としました。

## クロスプラットフォーム開発
私の持っている環境だとLinuxとWindowsがあるのでこの環境に対応できるように設計します。お題があまり良くなかったのかソースは1つだけど手間は2倍のままだった気がします。シェル回りはLinux/Windowsで違いすぎました。

あとMacは所有していないので動作確認は出来ませんがコンパイルするだけならタダなので、リリースはしています。誰か私にMBAを恵んでください。スタバでどや顔したいです。
https://github.com/nak1114/dcenv/releases

## 高速なサーバサイド
当初はバックエンドも作る予定でした。3月3日に某ゲーム機が発売されるため、これを作る余裕が無くなりそうなので[Kii](https://jp.kii.com/)というBaaSに丸投げです。ハイラルに平和を取り戻したら、もう一度挑戦してみようかと思います。

## マスコットが可愛い
Goにおいては超重要事項です。Goのコンパイラは些細な事でエラーを吐いてくれるので、私の頭部毛根の健康状態が危機的状況になるのですが、標準ライブラリの検索で https://golang.org/ に行くたびに、コイツが出迎えてくれるので何とか作り終えた感じです。

#最後に
普通にCにGCを追加した素朴な言語でした。当初はRubyと比べながら開発していたのですが、全然違いましたね。
Go言語の過剰なエラーは開発初期には邪魔でしかないという感想なのですが、先輩諸兄はこのコンパイラとどのように付き合っているのか気になります。今回は都合3回くらいデータ構造を変更したのですが、その度に大量エラーが…。初期はRubyのようはゆるーーーい言語で書いて、ある程度仕様が固まって、なお速度が必要ならGoに手を出すのが良いのかと愚考します。