Help us understand the problem. What is going on with this article?

Packer + itamaeでDockerfileのないDockerライフ

More than 3 years have passed since last update.

Dockerは Dockerfile という独自のDSLで記載されたファイルからDockerイメージを作成するのだが、
普段かいてるitamae使えないかなと思ったらどうやら Packerというものと組み合わえるといけるらしい

Packerを使ってChef/Puppet/AnsibleでDockerのイメージをつくる

ただ僕が普段使っているのはItamae。。。Packerでは現状対応してないという。

Packerとは?

VagrantとかTerafformとかを作っているHashicorp社製のソフトウェア

https://www.packer.io/

複数のプラットフォームのマシン、コンテナイメージを1つの設定ファイルから作成できる。

身近な例でいうと

AMIの作成をコマンド一発で作れるようになる。
他にもbuild先を切り替えるとGCEとかVMwareとかのイメージが作れるようになる

お題

rubyの2.3.1が動いていてrailsで rails new したての時に出るwelcomeページを出す。
なおrailsのプロジェクトはローカルにある状態からスタートする。

※ rubyとかrailsは公式のdockerイメージがあるけど、今回は身近なものを題材にしたかっためこちらにしました 

今回やったものはすべてここにpushしてあります
https://github.com/hatappi/packer-docker-sample

Dockerfile -> Dockerイメージ

Dockerに関してはrubyのDockerイメージがあるので、それに上乗せする形で作る。
やってることはだいたい見てだいたい分かるとは思う。
ADD? RUN? なんだろうはググってください

Dockerfile
FROM ruby:2.3.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /work
WORKDIR /work
ADD ./rails /work
RUN bundle install

EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]

最終的にCMDでrails serverを指定しているのでrunした時にrails serverが立ち上がる

$ docker build -t [image name] .
$ docker run -p 3000:3000 [image name]

Packer -> Dockerイメージ

まず全体的な流れからいくと
ubuntuのイメージを落としてきて

  1. railsプロジェクトをアップロード
  2. rbenvをいれて2.3.1をインストール
  3. bundle install

を行う。
2からitamaeを使用する。
itamaeに関してはレシピごとマシンにアップロードして itamae local する

Packerの構成

Packerには大きく buildersprovisionerspost-processors で構成される。

  • builders
    • Packerのコアの部分。何を元に何を出力したいのかが記載される。今回はDockerなので元イメージは何か?出力パスは何か?を記載する
  • provisioners
    • プロビジョニングの設定。shellとかPuppet, Ansible, Chefなどの指定をここで行う。
  • post-processors
    • ここはbuildが終わった後の処理を記載する。今回だとdocker imageの名前を指定してimportしたり、S3にファイルをアップロードしたり出来る。

これらの設定をPackerでは一つのファイルに記載する。

Packerの設定ファイルのJSON

Packerではprovisionersでitamaeが提供されていないので、自分でやってあげる必要があって
itamaeとかのレシピをアップロードしてサーバー上で itamae local してあげる流れになる

今回はrubyが入っていないイメージを選択したのでitamaeを動かすためにitamae_setup.shで一旦rubyをpackageからインストールしてます

manifest.json
{
    "builders":[{
        "type": "docker",
        "image": "ubuntu:14.04.5",
        "export_path": "image.tar"
    }],
    "provisioners": [
        {
            "type": "shell",
            "inline": [
                "mkdir -p /infra",
                "chmod a+w /infra"
            ]
        },
        {
            "type": "file",
            "source": "./",
            "destination": "/infra"
        },
        {
            "type": "file",
            "source": "../rails",
            "destination": "/"
        },
        {
            "type": "shell",
            "inline": [
                "sh /infra/scripts/ubuntu/setup.sh",
                "cd /infra/itamae && bundle install --path vendor/bundle",
                "cd /infra/itamae && bundle exec itamae local /infra/itamae/roles/ubuntu/default.rb",
                "sh /infra/scripts/ubuntu/cleanup.sh"
            ]
        }
    ],
    "post-processors": [{
        "type": "docker-import",
        "repository": "packer-docker-sample/rails"
    }]
}

Packer実行

command 一発

$ packer build manifest.json

あとは下記のようなコマンドを叩いてあげれば終わり

docker run -p 3000:3000 -w /rails -it [image name] /bin/bash -lc '/rails/bin/rails s -b 0.0.0.0'

まとめ

実はitamaeにはDockerイメージを作成する itamae docker コマンドがある。
ただPackerはbuidlerの部分を変えてあげればAWSのAMIにもなるし、post-processorsを指定すれば
イメージをdocker hubにpushとかも出来る単にイメージを作成するだけではないので良さ気。

今回はrails serverするだけだったので結果的にDockerfileの方がシンプルになってしまったけど
設定ファイルかいたり細かいとこしだすときっとPacker + itamaeが良いじゃんってなるはず。

あと今回rubyを使うプロジェクトだったから良いものの毎回itamae localするために対象マシンにrubyをインストールするのは
時間もかかるし無駄だなと思う。でもitamaeは書きたい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away