読者です 読者をやめる 読者になる 読者になる

Thanks Driven Life

日々是感謝

DockerHub 公式の Language Stacks を試してみた (golang:onbuild)

経緯

DockerHub公式の言語Stack | SOTA

かっこいいと思ったので

(追記)

この記事書いたあとに、こういうのあるの気づいた

Goの公式dockerイメージを使ってみた - Qiita

こっちの方が詳しそうなのでみなさん下記は読まなくてもいいです

実践

Rails の ONBUILD イメージ および golang のイメージ については @ さんが既に書かれていましたので、私は golang の ONBUILD イメージ を試してみました。

素材に使ったのは @ さんの 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 の流れ

  1. go の環境構築が行われgolang:1.3.1 をもってくる
  2. カレントディレクトリ (今回は mattn/go-lingr/lingr-ircd に該当) を、イメージの /go/src/app にコピー
  3. go-wrapper download/go/src/app 上で行われる
    • = $ go get -v -d
    • 現在 /go/src/app には mattn/go-lingr/lingr-ircd があるので、lingr-ircd.go を build するのに必要なパッケージがダウンロードされる(であってるかな…)
  4. go-wrapper install/go/src/app 上で行われる
    • = $ go get -v
    • /go/src/app 以下には main パッケージを持つ lingr-ircd.go があるため、こいつが build されて /go/bin 以下に app という名前でインストールされる

docker run を実行すると

  1. go-wrapper run (= exec app) が行われる
    • app とは /go/bin/app のこと。

こんな感じで動いてくれる模様。

まとめ

書こうと思えば FROM golang:... の一行だけ Dockerfile に書いておけば go build からのバイナリ実行までをしてくれる環境が作れる。

go-wrapper を見ると .godir とか見てて今いち用途がわからなかったけど、なんかいろいろできるんだろう。

そんなわけで自前でもってるコンテナのいくつかは公式の Language Stack を利用していきたい