ハマったのでメモ。
問題
https://github.com/drone/images に build 用の Dockerfile などがおいてあるので、それをいじってビルドするのがてっとり早いようだ。
例えば ruby 2.1.1 のコンテナをビルドするには次のようにする
git clone https://github.com/drone/images
cd image
sudo docker build --rm -t bradrydzewski/ruby:2.1.1 builder/ruby/ruby_2.1.1/
ruby 2.2.2 の docker コンテナが欲しかったので、
cp -a builder/ruby/ruby_2.1.1 builder/ruby/ruby_2.2.2
sed -i 's/2.1.1/2.2.2/g' builder/ruby/ruby_2.2.2/rbenv.sh
sed -i 's/2.1.1/2.2.2/g' builder/ruby/ruby_2.2.2/Dockerfile
して、
sudo docker build --rm -t sonots/ruby:2.2.2 builder/ruby/ruby_2.2.2
docker push sonots/ruby:2.2.2
とやったらすんなりできた。と思ったら、ハマった。
原因と対処
どうも drone 内部で、bradrydzewski もしくは drone プレフィックスのついた docker コンテナの場合は、ubuntu ユーザとしてコマンドを実行するが、それ以外の場合は root ユーザとしてコマンドを実行するようで、期待通りの動作をせずにエラーになってしまった。
なので、sonots/ruby ではなく bradrydzewski/ruby という名前にすれば良いらしい.もちろんその名前では docker push できないが、ローカルにはイメージが残るのでそのまま drone からご利用頂ける。docker build し直しても良いが、sonots/ruby で docker pull して、docker tag で名前をつけるだけにするとよさそう。
というわけで docker push
から続けて以下のコマンドを打って利用することにした。
sudo docker tag sonots/ruby:2.2.2 bradrydzewski/ruby:2.2.2
その他
https://github.com/drone/images に依存せずに自前で root 前提の image を作る手もありそう。ただ、Drone - サービスコンテナへのポートフォワーディングをどうしているのか読んでみたの記事にあるように socat がどうとかこうとかあるので、drone 内部をちゃんと把握してないと難しそう。
drone の変更に追随するメンテナンスコストもかかりそうだ。
おわりに
とのことで将来的には全部 root で動かすようになって、結果ネームスペースの制限もなくなるとのこと。たぶん、0.3 じゃなくて 0.4 の話だと思うけど。
それまでは設定もできないとのこと。カスタムビルドすればいいんかなー。