VagrantでPackerの作業環境を整える


MacでPackerを用いいてDocker imageの作成を試みたが期待通り動かなかったのでUbuntu上で作業を行う
この資料はMac環境でPackerを用いでdocker imageを問題なく作成できるようになるまでのメモです

# 準備
vagrantをmacにインストールしておく

# Ubuntuの用意
```shell
vagrant init
````

Vagrantfileに含まれるboxにて`ubuntu/trusty64`を指定する

```
vagrant up
vagrant ssh
```

## github/bitbucketなどで利用してるssh鍵を利用する
packerなんかの構成情報をgitで管理してる場合はrepositoryにアクセスするための鍵を利用できるようにする必要があるので。
特に試すだけなら不要

```
ssh-agent
ssh-add ~/.ssh/id_rsa (deploy keyなどを指定)
```

Vagrantfileにて`config.ssh.forward_agent = true`を追加

vagrantで起動済みの場合`vagrant reload`を実行しVagrantfileの設定を読み込む

# Packerのインストール

[How To Install and Get Started with Packer on an Ubuntu 12.04 VPS | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-install-and-get-started-with-packer-on-an-ubuntu-12-04-vps)

```shell
sudo apt-get install unzip
mkdir packer
cd packer/
wget https://dl.bintray.com/mitchellh/packer/packer_0.7.5_linux_amd64.zip
sudo unzip packer_0.7.5_linux_amd64.zip
```

.bashrcに以下を追加

```
export PATH=$PATH:~/packer/
```

読み込む

```
source ~/.bashrc
```

# Dockerのインストール
[Ubuntu - Docker Documentation](https://docs.docker.com/installation/ubuntulinux/#ubuntu-trusty-1404-lts-64-bit)


```shell
sudo apt-get update
sudo apt-get install docker.io
```

```
source /etc/bash_completion.d/docker.io
```

動作確認

```
vagrant@vagrant-ubuntu-trusty-64:~/packer$ sudo docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-8:1-262387-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 291.5 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 0.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.13.0-46-generic
WARNING: No swap limit support
````

## dockerをsudo無しで利用できるようにする
packerで利用するだけという前提で以下を参考にsudo無しで利用できるようにする

* [How can I use docker without sudo? - Ask Ubuntu](http://askubuntu.com/questions/477551/how-can-i-use-docker-without-sudo)
* [Ubuntu - Docker Documentation](https://docs.docker.com/installation/ubuntulinux/#giving-non-root-access)

```shell
$ sudo groupadd docker
groupadd: group 'docker' already exists #登録済みだった
$ sudo gpasswd -a ${USER} docker
Adding user vagrant to group docker
$ sudo service docker restart
docker: unrecognized service # (´Д｀)ﾊｧ…
$ sudo service docker.io restart # ubuntu14.04 はpackage名がdocker.io
docker.io stop/waiting
docker.io start/running, process 1739
```

docker groupへの追加を有効にするため`newgrp docker`を実行するかvmを再起動する

# packerでDocker imageを構築する
`packer build config.json`

```config.json
{
    "builders": [
        {
            "type": "docker",
            "image": "ubuntu:14.04",
            "export_path": "ubuntu.tar"
        }
    ],
    "provisioners": [
        {
            "type": "shell",
            "inline": ["echo test"]
        }
    ],
    "post-processors": [
        [
            {
                "type": "docker-import",
                "repository": "shiwork/ubuntu",
                "tag": "0.1"
            }
        ]
    ]
}
```

```shell
$ packer build config.json
docker output will be in this color.

==> docker: Creating a temporary directory for sharing data...
==> docker: Pulling Docker image: ubuntu:14.04
    docker: Pulling repository ubuntu
==> docker: Starting docker container...
    docker: Run command: docker run -v /tmp/packer-docker756254750:/packer-files -d -i -t ubuntu:14.04 /bin/bash
    docker: Container ID: 408f626466bd8090f06b1f948930b0da99a786145a176423a05af902ef96322b
==> docker: Provisioning with shell script: /tmp/packer-shell638185518
    docker: test
==> docker: Exporting the container
==> docker: Killing the container: 408f626466bd8090f06b1f948930b0da99a786145a176423a05af902ef96322b
==> docker: Running post-processor: docker-import
    docker (docker-import): Importing image: Container
    docker (docker-import): Repository: shiwork/ubuntu:0.1
    docker (docker-import): Imported ID: 0b2141004ce9f60f6786adfc0dfb1cc6245dea3805630d7d8c6b64abce850f3d
Build 'docker' finished.

==> Builds finished. The artifacts of successful builds are:
--> docker: Imported Docker image: shiwork/ubuntu:0.1
```

# まとめ
あっさり動いたなー。Mac上のPackerでやった時はあれこれ試して無理だったのに。Packer, Docker周り弄るときは当分Linux上でやったほうが良いかもしれないですねー。

# 追記
VagrantとAnsibleのPlaybookを作成しました。
[packer-vagrant](https://github.com/shiwork/packer-vagrant)