DockerのscratchイメージでHello Worldする

はじめに

土曜日なので小ネタを書きます。

Amazon EC2 Container Service (ECS): ECSエージェントの動作を確認するで、amazon-ecs-agentGoで書かれており、ビルドされたバイナリがDockerscratchイメージで動いていることが分かりました。

今回は、自分でGoバイナリを作成し、Dockerのscratchイメージで動かしてみたいと思います。動かすのは伝統のHello Worldです。

やってみた

環境はAmazon Linux on EC2です。

Go環境のセットアップ

Getting Started - The Go Programming Languageの通り、なのですが、ld-linux.so.2だけは追加でインストールが必要です。

$ sudo yum install ld-linux.so.2

Downloadsページから最新のtarボールを入手し、/usr/local配下に展開します。恒久的に設定する場合はPATHをprofileなりbashrcなりに書いて下さい。

$ wget https://storage.googleapis.com/golang/go1.4.linux-386.tar.gz
$ sudo tar -C /usr/local -xzf  go1.4.linux-386.tar.gz
$ export PATH=$PATH:/usr/local/go/bin
$ which go
/usr/local/go/bin/go

Goバイナリの作成

作業用ディレクトリを作り、Hello WorldするGoプログラムを書きます。

$ mkdir hello;cd hello
$ vi hello.go
package main

import "fmt"

func main() {
    fmt.Printf("Hello, World\n")
}

そしてビルドし、バイナリを作成します。

$ go build hello.go
$ ls
hello    hello.go

バイナリを実行すると"Hello, World"と帰ってきます。

$ ./hello
Hello, World

Dockerイメージを作成する

Dockerfileを書きます。scratchイメージをFROMとし、先ほど作成したhelloを組み込みます。

$ vi Dockerfile
FROM scratch
COPY ./hello /hello
CMD ["/hello"]

docker buildします。

$ sudo docker build -t local/hello .
Sending build context to Docker daemon 1.564 MB
Sending build context to Docker daemon
Step 0 : FROM scratch
 ---> 511136ea3c5a
Step 1 : COPY ./hello /hello
 ---> a3c0b4115aa1
Removing intermediate container 222d142413e5
Step 2 : CMD /hello
 ---> Running in 5b61c49f4af4
 ---> 70da0ed0ca59
Removing intermediate container 5b61c49f4af4
Successfully built 70da0ed0ca59

Dcokerイメージが作成されたことを確認します。

$ sudo docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
local/hello            latest              70da0ed0ca59        14 minutes ago      1.56 MB

Dockerコンテナを起動する

では作成したlocal/helloを起動します。

$ sudo docker run local/hello
Hello, World

はい、Hellow Worldされました!

まとめ

scratchの用途がイメージ出来ました。scratchは超最小イメージなので複数ファイルで構成されるようなアプリケーションは手間がかかりそうですが、バイナリ一つで動かせるようなアプリケーションだと重宝しそうです。