11
11

More than 5 years have passed since last update.

PackerでDocker Imageをビルドしてみました

Last updated at Posted at 2014-06-25

PackerでDockerのイメージをビルドする手順

まずはビルド用の.jsonファイルを用意する。

// redis_packer.json 
{
    "builders":[{
        "type": "docker",
        "image": "ubuntu",
        "export_path": "redis_packer_image.tar"
    }],
    "provisioners":[
        {
            "type": "shell",
            "inline": [
                "apt-get -y update",
                "apt-get install -y redis-server"
            ]
        }
    ],
    "post-processors": [
        [
            {
                "type": "docker-import",
                "repository": "liubin/redis",
                "tag": "packer"
            },
            "docker-push"
        ]
    ]
}

packerコマンドでビルドする。

sudo packer build redis_packer.json

ビルド中の出力

docker output will be in this color.

==> docker: Creating a temporary directory for sharing data...
==> docker: Pulling Docker image: ubuntu
    docker: Pulling repository ubuntu
==> docker: Starting docker container...
    docker: Run command: docker run -d -i -t -v /tmp/packer-docker025602017:/packer-files ubuntu /bin/bash
    docker: Container ID: 9aa0984a820d7158c975a9d76cc560d0de0a59423bb82dcbc1a263051ac12adf
==> docker: Provisioning with shell script: /tmp/packer-shell448633696
    docker: Ign http://archive.ubuntu.com trusty InRelease

~~~~~ 省略:apt-get XXX の出力 ~~~~

    docker: Processing triggers for ureadahead (0.100.0-16) ...
==> docker: Exporting the container
==> docker: Killing the container: 9aa0984a820d7158c975a9d76cc560d0de0a59423bb82dcbc1a263051ac12adf
==> docker: Running post-processor: docker-import
    docker (docker-import): Importing image: Container
    docker (docker-import): Repository: liubin/redis:packer
    docker (docker-import): Imported ID: 30e3f178a05b602aafb5991da161c5f280f56f301a956b1e942c5c4adc548277
==> docker: Running post-processor: docker-push
    docker (docker-push): Pushing: liubin/redis
    docker (docker-push): The push refers to a repository [liubin/redis] (len: 3)
    docker (docker-push): Sending image list
    docker (docker-push): Pushing repository liubin/redis (3 tags)
    docker (docker-push): Pushing tag for rev [2f21e9eb9e82] on {https://registry-1.docker.io/v1/repositories/liubin/redis/tags/dockerfile}
    docker (docker-push): Pushing tag for rev [744ce29b2fcf] on {https://registry-1.docker.io/v1/repositories/liubin/redis/tags/manually}

.......

Build 'docker' finished.

==> Builds finished. The artifacts of successful builds are:
--> docker: Imported Docker image: liubin/redis:packer

内訳

上記のログからよくわかると思いますが、PackerはBASEとなるイメージをContainerとして起動させ、Containerの中にProvisioningをして、最後にContainerをExposeをした。手動でイメージをビルドと同じです。

post-processorsの部分は生成した"redis_packer_image.tar"をローカルのリポジトリに導入し、さらにDocker Hubにアップロードしました。

詳細はマニュアルで確認ください。

Dockerfileと異なる点(また問題点)

履歴は残れない

Packerはかなり原始的なアプローチをとったのが原因だと思う。

# Packerで作ったイメージに履歴はない。

$ sudo docker history liubin/redis:packer
IMAGE               CREATED             CREATED BY          SIZE
30e3f178a05b        22 hours ago                            249.1 MB

# dockerfileで作ったイメージに履歴はちゃんと残っている
$ sudo docker history liubin/redis:dockerfile
IMAGE               CREATED             CREATED BY                                      SIZE
2f21e9eb9e82        24 hours ago        /bin/sh -c #(nop) ENTRYPOINT [/usr/bin/redis-   0 B
016287bed93b        24 hours ago        /bin/sh -c #(nop) EXPOSE map[6379/tcp:{}]       0 B
ba0681b90522        24 hours ago        /bin/sh -c apt-get -y install redis-server      2.388 MB
e7fbd2e3ce12        24 hours ago        /bin/sh -c apt-get update                       3.764 MB
c8ead3c65fde        24 hours ago        /bin/sh -c #(nop) MAINTAINER bin liu <liubin0   0 B
e54ca5efa2e9        6 days ago          /bin/sh -c apt-get update && apt-get install    178.4 kB
6c37f792ddac        6 days ago          /bin/sh -c apt-get update && apt-get install    83.61 MB
83ff768040a0        6 days ago          /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.903 kB
2f4b4d6a4a06        6 days ago          /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
d7ac5e4f1812        6 days ago          /bin/sh -c #(nop) ADD file:adc47d03da6bb2418e   192.5 MB
511136ea3c5a        12 months ago                                                       0 B

イメージのサイズは違う

下記の例にTAGがdockerfileとなるのはDockerfileで生成した、サイズはPackerで生成したイメージより大きかった(40MBぐらい)。

*2014/6/25 18:00 追記:詳しい情報は#コメント2をご参照ください。

※ 3つのliubin/redisイメージはすべて apt-get -y updateapt-get install -y redis-serverでビルドした。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
liubin/redis        packer              30e3f178a05b        22 hours ago        249.1 MB
liubin/redis        dockerfile          2f21e9eb9e82        24 hours ago        282.6 MB
liubin/redis        manually            744ce29b2fcf        26 hours ago        282.3 MB

ENTRYPOINT・EXPOSEなどDockerfileにあるオプションを指定できない

指定できないため、イメージを使うとき(docker run)で詳しい情報提供しなければならない。別に大きい不便でも感じられなさそうだ。

マニュアルにもその原因が載せている。

最後に感想

オフィシャルサイトを読めば、Cloudのために生まれたツールの感じがする。
なかなか面白いツールじゃないかと。ぜひお試してください。

11
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11