この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
土曜日なので小ネタを書きます。
Amazon EC2 Container Service (ECS): ECSエージェントの動作を確認するで、amazon-ecs-agentはGoで書かれており、ビルドされたバイナリがDockerのscratchイメージで動いていることが分かりました。
今回は、自分で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は超最小イメージなので複数ファイルで構成されるようなアプリケーションは手間がかかりそうですが、バイナリ一つで動かせるようなアプリケーションだと重宝しそうです。