homebrewやcurl -sL {url} | shなどの/usr/local/binに置く以外にもdockerを使って配布できますよ、という備忘録。

Dockerfile

curlでインストールできるのであれば、Dockerfileを以下のように記述します。

Alpine Linuxは軽量Linuxで apkコマンドを使ってパッケージをインストールします。デフォルトではbashすらも入っていないので、bashとcurlをインストールしてcurl -sL方式でコンテナ側の/usr/local/binにインストールします。あとはENTRYPOINTを配列形式にすると、コマンドの記述を省略できるので以下の形式でコマンドを実行できます。

コンテナ内でgolang製のCLIツールをビルドしたい場合のDockerfileはこんな感じです。

vendoringしていない場合、vendoringしていてvendorディレクトリがリポジトリに含まれている場合は go getするだけで良いです。vendoringしていてvendorディレクトリがリポジトリに含まれていない場合は、git cloneしてから各vendoringのツールで依存パッケージをインストールします。上記Dockerfileだとmake deps内で glide自体のインストールと glide installの実行をしています。

Alpineを使わない場合はonbuildのコンテナを使って、以下の記述をするだけでOKです(サイズが少し大きくなります)

ただし、こちらの場合もvendorディレクトリがリポジトリに無く、vendoringを効かせたい場合はglideをインストールしたりする必要があります。ローカルでbuildしてビルドしたイメージをリモートに設置するのであれば、vendorディレクトリが既にあるので、上のスクリプトのままでOKです。

ちなみにコンテナ内にバイナリを直接置くスタイルが一番イメージのサイズが少ないです(spmで7MB程度)

イメージの設置

Docker Hubを使います。Githubとリンクさせる場合は [Create Automated Build]でGithubを選択してリポジトリを作成するだけです。[Create Repository]を選択した場合は、dockerコマンドでローカルからイメージをpushします。