もうかれこれ1ヶ月ほど Packer 0.7.5 で Docker 1.4+ を使ってる状態からdocker builderを使っても永遠に処理が終わらず、終わったと思ったらなんかdockerのエラーで止まるということが続いていた。

tl;dr;としては「多分次のバージョンのPackerで直る」「今はパッチを当ててソースからコンパイルしろ」なんだけど、まずデバッグも含め経緯を。

packerには-verboseみたいなのがなくて、まず状況が把握できなかった。これはPACKER_LOG=1 環境変数を指定することで詳細ログを表示できる。これで以下のようなエラーが出てたら多分このバグ→ #1752

2014/12/25 12:21:32 packer-provisioner-shell: 2014/12/25 12:21:32 Retryable error: Error uploading script: Upload failed with non-zero exit status: 1

で、いろいろ見てるとどうもこの変更で直るくさい。2014年12月(0.7.5の出た9日後)にPRが出てるんだけど、その後修正版PRがやっと出たのが2015年3月… そして2015年4月22日時点でまだマージされてない。

というわけでまだ修正版は存在しないんだけど、docker execを使ったバージョンの野良ビルドを作った人がいる。一応このバイナリは信用できると思うんだけど、野良ビルドだからこれを使う場合はみなさま自己責任でお願いします。

と、ここまでわかったが、PackerがOS X上のboot2dockerとではうまく動かないのはこの修正でも変わらないのでこちらの「Packerを使ってChef/Puppet/AnsibleでDockerのイメージをつくる」のVagrantによる手法でさらにyak shavingを続ける。上記の記事に書いてあるVagrantfileのpackerをダウンロードする部分を以下のように変更…

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/trusty64"
    config.vm.provision :docker do |d|
        d.pull_images "ubuntu"
    end

    config.vm.provision :shell, :inline => <<-PREPARE
apt-get -y update
apt-get install -y wget unzip curl

mkdir /home/vagrant/packer
cd /home/vagrant/packer
wget https://github.com/stefancocora/packer-issue1752-fix/archive/master.zip
unzip master.zip
mv packer-issue1752-fix-master/packer/* .
rm -rf master.zip packer-issue1752-fix-master
echo "export PATH=$PATH:/home/vagrant/packer" > /home/vagrant/.bashrc
PREPARE

end

で、これを使ってvagrant up, vagrant ssh, packer build ... すると、やっと!やっと!Packerを使いつつDockerイメージを作れる。

なんかここまでしてPackerからDockerを使う必要があるのかという噂もあるけど、AMIなりGCPイメージなりを作るとAWSないしGCPないしと通信しなくちゃいけないし、いろいろ試してる間は自分の環境だけで終わらせたかった。PackerにはVirtualBoxとかのイメージを作る機能もあるけどその場合はベースとなるイメージを用意しなくてはいけない。でもそれをgitレポジトリにコミットしたくないのでどうしてもDockerを使いたかった、というのがここまでがんばってみた理由です。