経緯
かっこいいと思ったので
(追記)
この記事書いたあとに、こういうのあるの気づいた
こっちの方が詳しそうなのでみなさん下記は読まなくてもいいです
実践
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 を利用していきたい