docker
packer
systemd
centos7

PackerでCentOS7のDockerイメージをつくってみた

templateなどの備忘録を。
vagrantではご不満な方がいるようだったが素のイメージだとなんも入ってない、
しかしDockerファイルちまちまいじってビルドするのがめんどくさすぎるから、
Packerで自分にとっては楽なAnsibleかまして作ろうかな~と作ったのだけども、
若干オプション弄り回さないとD-Busがどうのこうのとエラーが出たので書いときます。
以下のとおり、buildersのセクションにprivilegedとrun_commandを追加したのがD-Busのエラーの対処です。

{
  "variables": {
    "docker_hub_login_username": "",
    "docker_hub_login_email": "",
    "docker_hub_login_password": "",
    "docker_hub_repository": ""
  },
  "builders": [
    {
      "type": "docker",
      "image": "centos:centos7",
      "export_path": "packer-centos7-docker.tar",
      "privileged": "true",
      "run_command": ["-d", "-i", "-t", "{{.Image}}", "/sbin/init"]
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "execute_command": "sh -x {{ .Path }}",
      "scripts": [
        "scripts/centos/centos-first.sh",
        "scripts/centos/ansible-install.sh"
      ]
    },
    {
      "type": "ansible-local",
      "playbook_file": "provision/ansible/baseimage.yml",
      "inventory_file": "provision/ansible/hosts",
      "role_paths": [
        "provision/ansible/roles/baseimage",
        "provision/ansible/roles/zabbix22-agent"
      ]
    },
    {
      "type": "file",
      "source": "tests/centos7",
      "destination": "/tmp"
    },
    {
      "type": "shell",
      "execute_command": "sh -x {{ .Path }}",
      "scripts": [
        "scripts/centos/serverspec_cent7.sh",
        "scripts/centos/initialization.sh"
      ]
    }
  ],
  "post-processors": [
    [
      {
        "type": "docker-import",
        "repository": "{{user `docker_hub_repository`}}",
        "tag": "timestamp"
      }
    ]
  ]
}

とりあえずpost-precesorsのdocker-pushにはしっぱいしたのでdocker login+docker pushを手動でやってました。

でてたエラー
(冒頭にかいたとおりprivilegedで特権指定とrun_commandでシェルをinitに渡すと出なくなったがマルチテナントでこれやるのはダメらしい。ホストOSへのwrite権限を渡すことになるためである模様。)

Failed to get D-Bus connection: Operation not permitted

参考
http://qiita.com/yunano/items/9637ee21a71eba197345
https://www.packer.io/docs/builders/docker.html#privileged

packerビルドするのはjenkinsかなにかのCIツールでやるとログの出力確認などがだいぶべんりです。
(GitのプラグインでcloneしてきてMaskPasswordプラグインで設定しといた変数を使ってます)

rm -f packer.zip
rm -rf .packer
curl -L -o packer.zip https://releases.hashicorp.com/packer/1.0.3/packer_1.0.3_linux_amd64.zip
mkdir -p .packer
(cd .packer && unzip ../packer.zip)

sudo $JENKINS_HOME/workspace/packer-build/$JOB_BASE_NAME/.packer/packer build \
  -color=false \
  -var "docker_hub_login_username=${DOCKER_HUB_LOGIN_USERNAME}" \
  -var "docker_hub_login_email=${DOCKER_HUB_LOGIN_EMAIL}" \
  -var "docker_hub_login_password=${DOCKER_HUB_LOGIN_PASSWORD}" \
  -var "docker_hub_repository=${DOCKER_HUB_REPOSITORY}" \
  $JENKINS_HOME/workspace/packer-build/$JOB_BASE_NAME/builders/docker-centos7-ansible-zabbix22.json

とりあえずpacker活用してみたかっただけで作ったイメージをどうやってつかうかはまだ何も考えていないというか巨大なのでたぶんテスト用かなーというところです。コンテナだと普通のOSイメージと違って1プロセス1コンテナみたいな流儀がちょっとよくわかっていないかも。
CentOSにansibleかましてzabbix2.2いれて全体で13分くらいでしたが、 更新すると毎回似たような時間かかるのでDockerfileでキャッシュさす最終行更新なら一瞬とかにはかなわないのかなあという印象でした。