我尝试使用Packer构建Docker镜像

使用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将基础镜像作为容器启动,对容器进行配置,最后将容器暴露出来。这与手动构建镜像相同。

我将生成的”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生成的,其大小比由Packer生成的映像大(大约40MB)。

2014年6月25日18:00 追加:有关详细信息请参考#评论2。

以下的三个liubin/redis镜像都是通过apt-get -y update和apt-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

无法在Dockerfile中指定ENTRYPOINT、EXPOSE等选项。

当使用镜像时(docker run),必须提供更详细的信息,因为无法指定。尽管这并不会带来太大的不便。

手册里也有列出了原因。

最后的印象

如果您阅读官方网站,会感受到这是一款专为云端而生的工具。它是相当有趣的工具,请务必试用一下。

广告
将在 10 秒后关闭
bannerAds