経緯
かっこいいと思ったので
(追記)
この記事書いたあとに、こういうのあるの気づいた
こっちの方が詳しそうなのでみなさん下記は読まなくてもいいです
実践
Rails の ONBUILD イメージ および golang のイメージ については @deeeet さんが既に書かれていましたので、私は golang の ONBUILD イメージ を試してみました。
素材に使ったのは @mattn_jp さんの go-lingr です。
$ git clone https://github.com/mattn/go-lingr $ cd go-lingr/lingr-ircd $ echo 'FROM golang:1-onbuild' >> Dockerfile $ echo 'EXPOSE 26667' >> Dockerfile $ docker build -t go-lingr .
イメージができたので起動
$ docker run -d go-lingr f2b0e21667a4c6688808921c1301c07dfaf9b23f857b8ab1f52d5b30af1f0c7e $ docker ps | grep go-lingr f2b0e21667a4 go-lingr:latest "go-wrapper run" 13 seconds ago Up 13 seconds 0.0.0.0:26667->26667/tcp desperate_kowalevski $ telnet localhost 26667 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. ^] telnet> quit Connection closed. $
少しだけ解説
golang の ONBUILD イメージの Dockerfile を見てみるとこんな感じ
FROM golang:1.3.1 RUN mkdir -p /go/src/app WORKDIR /go/src/app # this will ideally be built by the ONBUILD below ;) CMD ["go-wrapper", "run"] ONBUILD COPY . /go/src/app ONBUILD RUN go-wrapper download ONBUILD RUN go-wrapper install
go-wrapper というのは golang:1.3.1 で ADD されているコマンドです
docker-library/golang go-wrapper
docker build の流れ
- go の環境構築が行われ た
golang:1.3.1をもってくる - カレントディレクトリ (今回は
mattn/go-lingr/lingr-ircdに該当) を、イメージの/go/src/appにコピー go-wrapper downloadが/go/src/app上で行われる- =
$ go get -v -d - 現在
/go/src/appにはmattn/go-lingr/lingr-ircdがあるので、lingr-ircd.goを build するのに必要なパッケージがダウンロードされる(であってるかな…)
- =
go-wrapper installが/go/src/app上で行われる- =
$ go get -v /go/src/app以下には main パッケージを持つlingr-ircd.goがあるため、こいつが build されて/go/bin以下にappという名前でインストールされる
- =
docker run を実行すると
go-wrapper run(=exec app) が行われる- app とは
/go/bin/appのこと。
- app とは
こんな感じで動いてくれる模様。
まとめ
書こうと思えば FROM golang:... の一行だけ Dockerfile に書いておけば
go build からのバイナリ実行までをしてくれる環境が作れる。
go-wrapper を見ると .godir とか見てて今いち用途がわからなかったけど、なんかいろいろできるんだろう。
そんなわけで自前でもってるコンテナのいくつかは公式の Language Stack を利用していきたい