その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Docker 使って golang で書いたツールの cross platform build をする

まず以下の様なシェルスクリプトを用意する.

#!/bin/bash

# ここで依存しているパッケージを go get する
# 例えば以下の様な感じ
# go get -v gopkg.in/yaml.v2
# go get -v gopkg.in/redis.v3

for GOOS in darwin linux; do
  for GOARCH in 386 amd64; do
    export GOOS
    export GOARCH
    go build -v -o bin/tool-$GOOS-$GOARCH main.go
  done
done

darwin と linux について,それぞれ i386 と amd64 アーキテクチャ向けのバイナリを作るようなスクリプト.main.go はビルド対象のファイル.成果物はカレントディレクトリの bin 以下に生成されるので,あらかじめ mkdir しておく必要がある (後述).

なお,GOOS と GOARCH を export しておかないとうまく動かない.ドキュメントではこれが省略されていて少しハマった.

そんでもってこのスクリプトを呼び出す.以下は Makefile の例.

build:
	docker run --rm -v "$(PWD)":/go/src/github.com/moznion/tool -w /go/src/github.com/moznion/tool golang:1.6 bash build.sh

ここでは docker hub で公開されている golang のイメージを利用している.
https://hub.docker.com/_/golang/

-v オプションを使ってカレントディレクトリに docker image 内の go path が通っている然るべきディレクトリをマウントする.
でもって,-w オプションでマウントしたディレクトリをワーキングディレクトリに設定し,上記のシェルスクリプトを image 内で実行する.

と,ワーキングディレクトリ以下の bin に成果物が吐き出され,ワーキングディレクトリはカレントディレクトリにマウントされているので,つまり成果物はカレントディレクトリ以下の bin に出力されてハッピーという寸法!

なお,--rm オプションを付けておかないと実行する度にゴミ container がどんどん溜まっていくのでつけたほうが良い.

Ref;

実際のコードはここに書いてある感じのやつ


追記

cgo 使わない,なおかつ go 1.5 以上であれば make だけで完結するとのこと!

Docker 使って golang で書いたツールの cross platform build をする - その手の平は尻もつかめるさ

別にdockerもシェルスクリプトもいらなくて makeだけで完結しそうな予感/アンサーソングしといた http://lestrrat.ldblog.jp/archives/48673706.html

2016/05/24 06:27
b.hatena.ne.jp

なお,gox 及び goxc については go 1.4 以下の便利ツールという立ち位置とのこと.