先日、会社のエンジニア全員が参加するハッカソンでDocker Indexというアプリを作りました。
名前はさておき、Docker Index とは、Docker Registoryに登録されているコンテナを一覧表示するWebApplicationです。
Docker RegistoryはDocker Hub(のようなもの)を自分のサーバにたてられようなものです。
ただ、WebUIは一切用意してくれていないので、
会社でみんながDocker Registoryに作成したコンテナをpushしてくれていても、
どんなコンテナが存在するのか確認する術がありませんでした。
これが、作成しようと思った動機。
使用言語、フレームワーク
このハッカソンのルール(?)は、普段業務であまり使っていない言語・フレームワークを選択しよう!というもの。
そこで、何にしようかと考えたところ、DockerもGoで書かれているし、Goで書くということにしました。
フレームワークは、普段業務ではPlay2/Scalaを使っているため、雰囲気が似ているというRevelを使ってみようと思い採用しました。
そして、どうせならやっぱりDockerコンテナで動かしたいよね。
ということで、ゴールは“DockerコンテナでDocker Registoryに保存されているコンテナを一覧表示するWebUIを作る”というものを設定しました。
4, 5時間で、初めての言語、初めてのフレームワークということなので、このくらいの課題でちょうどいいかなと思います。
ハッカソンは何か動くものを作るのが目標なので。
つくってみた
とりあえず、ローカルで環境をつくりgo/revelの環境をつくり、hello worldを済ませました。
最初IntelliJでやっていたんだけど、微妙な感じだったので(うまく設定できてない?)atomでやりました。
入れたパッケージは多分こんな感じ
- typester/atom-gocode
- joefitzgerald/go-plus
ドキュメントとかは適当にココらへんを読んだり、Golangテーブルでハッカソンしてる人に聞いたりしてしました。
内部的にはディレクトリの内容をみて、一覧しているだけなので大したことはしてません。
しかも、パッケージの切り方がよくわからず、全てコントローラーに突っ込んであります(※ハッカソンです)。
そして、できたのがこんなかんじ。
問題
###パッケージの切り方がよくわからなかった
なんか、単純にpackageを/
できって、ディレクトリ構造と合わせてみてもならなかったので、時間の都合上後回しにしました。
docker build
しようとするとbuildable
じゃないと怒られる
docker build
したときにbuildable
じゃないと言われ、途中で止まってしまう問題が発生しました。
多分、実行用にいろいろしなきゃいけないんだろうなぁと思いながら、時間がないのでとりあえずrevel run
で動く状態で放置してました。
Step 4 : RUN go get github.com/ringohub/docker-index
---> Running in cf9d1b96d14f
package github.com/ringohub/docker-index
imports github.com/ringohub/docker-index
imports github.com/ringohub/docker-index: no buildable Go source files in /gopath/src/github.com/ringohub/docker-index
リターンコードが0
じゃないと途中で止まってしまうっぽかったので、
対症療法として、;echo ''
を実行しリターンコードを誤魔化したりしてみました。
どなたか、正しいやり方教えてください。
感想
- 半日で何かを作るのは時間的に難しいかった。
- でも、使ったこと無い言語やフレームワークに挑戦するのは楽しい!
- ハッカソンテーマが「出会い」ということをすっかり忘れていて、発表が始まってから気づいた
- gopherがかわいくみえてきた(人形欲しい)
来年もまたがんばります。
成果物
今回作った、revelアプリやDockerfileはこちらにおいてあります。
突っ込みどころ満載なので、プルリクし放題です。
golangerたちのプルリクを頂けると勉強になるとおもうのでお待ちしております!
dwanGoも開催されます!