2017年2月20日月曜日

golang のコードを Docker 上でビルドする方法

概要

golang でコーディングをしているときに開発マシンの golang のバージョンが 1.6 になっていて「1.7 でビルドしたいなー」ってことがあると思います
そんなときに Docker を使うと 1.7 上でもビルドできるので、その方法を紹介します

環境

  • Ubuntu 16.04 64bit
  • docker 1.12.6

golang:1.7 上でコードをビルドする

golang が Dockerhub で提供している公式のイメージを使います

ソースコードを準備する

何でも OK です
ローカルマシンで簡単な Go アプリを準備します

  • mkdir -p /root/go_app
  • cd /root/go_app
  • vim main.go
package main

import (
        "fmt"
)

func main() {
        fmt.Println("hoge")
}
  • go run main.go

で動作すると思います
これを Docker 上でビルドおよび動作させるようにしてみます

Dockerfile の作成

これもローカル上で実施します
先程の main.go と同じディレクトリに作成します

  • cd /root/go_app
  • vim Dockerfile
FROM golang:1.7

ADD . /go/src/github.com/hawksnowlog/test/

# Additinal go get commands in here.

RUN go fmt github.com/hawksnowlog/test
RUN go build github.com/hawksnowlog/test
RUN go install github.com/hawksnowlog/test

CMD ["test"]

今度は go run ではなく、ちゃんとビルドしてインストールしてバイナリを実行してみます
今回はサードパーティ製のライブラリを使っていないので go get はしていないですが、必要であれば記載することもできます

ビルドする

ではビルドしてみましょう

  • cd /root/go_app
  • docker build -t hawksnowlog/test .

ビルドが成功したら実行してみましょう

実行する

作成したイメージを実行して golang のコードがちゃんと動作するか確認します

  • docker run –rm hawksnowlog/test
hoge

と出力されれば OK です

もう少しインタラクティブにビルドできるようにする

上記の場合だと Dockerfile の内容が変更になったり、main.go の内容が変更になった場合に毎回 docker build する必要があり時間がかかります
アプリを本格的に CI/CD するようになったら上記の方法で問題ないと思いますが、ちょくちょくコードを変更する場合には効率が悪いです

なのでコンテナ上でビルド作業をする方法も紹介します

  • mkdir -p /root/go_app
  • cd /root/go_app
  • vim main.go
  • touch Dockerfile

で同じファイルを作成します
そして

  • docker pull golang:1.7
  • docker run –rm -it -v $(pwd):/go/src/github.com/hawksnowlog/test golang:1.7

でコードをコンテナ上で使えるようにマウントしてコンテナに入ります
そして

  • go fmt github.com/hawksnowlog/test
  • go build github.com/hawksnowlog/test
  • go install github.com/hawksnowlog/test

と一つ一つコマンドを実行することで、同じようにビルドすることができます
この方法の場合 main.go をローカル PC 上で変更すると、コンテナ上のファイルも変更されるので、またコマンドを実行すればいいだけなので開発効率的には良いと思います

最後に

golang のコードを Docker 上でビルドする方法を紹介しました
冒頭に記載したように異なるバージョンの golang 環境でビルドしたい場合には便利かなと思います

0 件のコメント:

コメントを投稿