対象
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を弄りたくて、ネタ探しという側面も・・・。
成果物
使い方
例としてgoコマンドを実行するまでです。
1. インストールして
$ dcenv install golang
2. デプロイして
$ dcenv local golang
$ dcenv rehash
3. コマンド実行
$ go version
go version go1.8 linux/amd64
これだけ。
環境切り替え
バージョン切り替え
$ dcenv tag golang:1.7
$ go version
go version go1.7.5 linux/amd64
ディレクトリによる切り替え
local
を実行した子孫のディレクトリのみで実行可能です。
$ mkdir child
$ cd child
$ go version
go version go1.7.5 linux/amd64
$ cd ../../
$ go version
bash: go: command not found
インストール方法
Linux(Bash)
.bashrcに環境変数を書いてリロードします。
export DCENV_HOME=~/.dcenv
export PATH=${DCENV_HOME}/shims;${DCENV_HOME}/bin;${PATH}
ファイルをダウンロードして展開します。
$ 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
> powershell Expand-Archive dcenv-v0.0.4-windows-amd64.zip -DestinationPath %DCENV_HOME%
その他コマンド
dcenvの状態を知るためにいくつかのコマンドがあります。
レジストリに登録されているコマンド(イメージ名)一覧
$ dcenv install --list
golang
naktak/clang
naktak/dcenv_test
インストールされたコマンド(イメージ名)一覧
$ dcenv yard --list
golang
現在のディレクトリで実行可能なコマンド一覧
$ dcenv command --list
COMMAND | IMAGE (FILE)
go | golang (/tmp/hoge/.dcenv_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 %*
現在のディレクトリで実行されるコマンドの詳細
$ dcenv command go
---[ go ]------------------------------
(略)
新規コマンド作成方法
未だレジストリには殆どコマンドがありません。
しかし、あなた自身で新しいコマンドを作り、レジストリに登録することが出来ます。
ここではbusyboxイメージを利用したls
コマンドとcat
コマンドを登録する方法を例示します。
コマンドのテンプレートを作成
$ dcenv yard --create busybox
Edit: ~/.dcenv/image_yard/busybox.yml
作成されたテンプレートファイル名が表示されます。
テンプレートを編集
$ vi ~/.dcenv/image_yard/busybox.yml
テンプレートファイルの詳細はGitHub上のDocを参照。
若しくは dcenv install naktak/dcenv-script-sample
がわかりやすいです。
作成したコマンドをチェックする
$ dcenv local busybox
$ dcenv rehash
$ ls
レジストリにユーザー登録する。(初回のみ)
GitHub上の登録画面( https://nak1114.github.io/dcenv/index.html )の‘Sign Up‘から登録する。
’Sign Up’を押すと登録したメールアドレスに確認メールが届きますので、メールに記載されているURLをクリックして登録完了です。
コマンドをレジストリに登録する。
$ dcenv push busybox
レジストリからログアウトする。
$ dcenv logout
登録したコマンドをレジストリから削除する。
間違えて登録したコマンドは削除できます。自分で登録したコマンド以外はレジストリから削除できません。
$ dcenv push -d busybox
dcenvのコマンドチートシート
Go言語所感
Go言語の宣伝されている特徴として以下があると思います。
- クロスプラットフォーム開発が容易である
- 並列化が容易である
- 高速なサーバサイドが構築できる
- マスコットが可愛い
並列化
に関しては依然作ったこれを移植するのが早いので、今回はクロスプラットフォーム開発
と高速なサーバサイド
を目標としました。
クロスプラットフォーム開発
私の持っている環境だとLinuxとWindowsがあるのでこの環境に対応できるように設計します。お題があまり良くなかったのかソースは1つだけど手間は2倍のままだった気がします。シェル回りはLinux/Windowsで違いすぎました。
あとMacは所有していないので動作確認は出来ませんがコンパイルするだけならタダなので、リリースはしています。誰か私にMBAを恵んでください。スタバでどや顔したいです。
https://github.com/nak1114/dcenv/releases
高速なサーバサイド
当初はバックエンドも作る予定でした。3月3日に某ゲーム機が発売されるため、これを作る余裕が無くなりそうなのでKiiというBaaSに丸投げです。ハイラルに平和を取り戻したら、もう一度挑戦してみようかと思います。
マスコットが可愛い
Goにおいては超重要事項です。Goのコンパイラは些細な事でエラーを吐いてくれるので、私の頭部毛根の健康状態が危機的状況になるのですが、標準ライブラリの検索で https://golang.org/ に行くたびに、コイツが出迎えてくれるので何とか作り終えた感じです。
最後に
普通にCにGCを追加した素朴な言語でした。当初はRubyと比べながら開発していたのですが、全然違いましたね。
Go言語の過剰なエラーは開発初期には邪魔でしかないという感想なのですが、先輩諸兄はこのコンパイラとどのように付き合っているのか気になります。今回は都合3回くらいデータ構造を変更したのですが、その度に大量エラーが…。初期はRubyのようはゆるーーーい言語で書いて、ある程度仕様が固まって、なお速度が必要ならGoに手を出すのが良いのかと愚考します。