fbpx

CL LAB

HOME > CL LAB > Chef > Habitat チュートリアルを実施してみる #getchef #habitat

Habitat チュートリアルを実施してみる #getchef #habitat

 ★ 11

本稿は Chef社によるアプリ自動化プロジェクト Habitatチュートリアル を実施してみた結果です。

Vagrant + VirtualBoxubuntu/xenial64 を起動し、そちらでチュートリアルを行ってみます。

Habitat を始めよう

Getting started with Habitat にある通り、事前準備を行います。

Get Habitat の通りに行います。ここでは For Linux をダウンロードしておきます。ubuntu/xenial64 (Ubuntu 16.04 LTS) は 64ビット版で Linux Kernel のバージョンが 4.4 なので、64ビット版の Linux Kernel 2.6.32 以上という条件を満たしています。

GitHub のアカウントを準備します。GitHub アカウントは作成した Habitat パッケージを他者と共有する際に必要となるようです。

今回は Linux 上でチュートリアルを行うので、Docker Engine をインストールしておきます。本稿の内容を実施した際は、Docker Engine 1.11.2 以上が必要です。

ubuntu@ubuntu-xenial:~$ curl -fsSL https://get.docker.com/ | sh
    :
ubuntu@ubuntu-xenial:~$

ubuntu@ubuntu-xenial:~$ sudo usermod -aG docker ubuntu
ubuntu@ubuntu-xenial:~$

ubuntu@ubuntu-xenial:~$ groups
ubuntu adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd docker
ubuntu@ubuntu-xenial:~$

ubuntu@ubuntu-xenial:~$ docker version
Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 22:00:43 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 22:00:43 2016
 OS/Arch:      linux/amd64
ubuntu@ubuntu-xenial:~$

コンセプト

Concepts にて、Habitat 特有の用語が解説されいるので、チュートリアルを進める前にざっと確認しておきます。

パッケージ(Package)

  • ポータブル
  • 暗号署名した tarball
  • アプリ、ランタイム、依存関係、設定データを同梱

スーパーバイザ(Supervisor)

  • パッケージ中のアプリやサービスをサポートするプロセスマネージャ
  • アプリの設定をリアルタイムで更新
  • デプロイした Habitat サービスの他のスーパーバイザとの通信に参加
  • ヘルスチェックや、サービスに関するステータスメッセージの提供
  • 他のアプリからの問い合わせに応答

サービス(Habitat service)

  • スーパーバイザと実行しているアプリ
  • パッケージ中で実行しているサービス

プラン(Plan)

  • パッケージが何を含むか、どのようにビルドするか、どのように設定するかを定義したシェルスクリプト

デポ(Depot)

  • アプリと依存関係にあるパッケージを含むレポジトリ
  • ローカルデポを作るのと同じように、パブリックな Habitat デポに接続できる

Habitat 環境の作成

Set up your environment に従い、Habitat を実行する環境を作っていきます。

先にダウンロードしておいた Habitat for Linux のアーカイブを展開します。

ubuntu@ubuntu-xenial:~$ tar xvfz hab-0.7.0-20160614230104-x86_64-linux.tar.gz
hab-0.7.0-20160614230104-x86_64-linux/
hab-0.7.0-20160614230104-x86_64-linux/hab
ubuntu@ubuntu-xenial:~$

1つだけ実行バイナリが入っています。これが Habitat の CLI である hab コマンドです。

ubuntu@ubuntu-xenial:~/hab-0.7.0-20160614230104-x86_64-linux$ ./hab
hab 0.7.0/20160614230104

Authors: The Habitat Maintainers <humans@habitat.sh>

"A Habitat is the natural environment for your services" - Alan Turing

USAGE:
    hab [FLAGS] [SUBCOMMAND]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    cli        Commands relating to Habitat runtime config
    config     Commands relating to Habitat runtime config
    file       Commands relating to Habitat files
    help       Prints this message or the help of the given subcommand(s)
    origin     Commands relating to Habitat origin keys
    pkg        Commands relating to Habitat packages
    ring       Commands relating to Habitat rings
    service    Commands relating to Habitat services
    studio     Commands relating to Habitat Studios
    sup        Commands relating to the Habitat Supervisor
    user       Commands relating to Habitat users

ALIASES:
    apply      Alias for: 'config apply'
    install    Alias for: 'pkg install'
    setup      Alias for: 'cli setup'
    start      Alias for: 'sup start'


ubuntu@ubuntu-xenial:~/hab-0.7.0-20160614230104-x86_64-linux$

ホームディレクトリに bin ディレクトリを作成してそちらに hab コマンドを移し、パスを通しておきます。

ubuntu@ubuntu-xenial:~$ mkdir bin
ubuntu@ubuntu-xenial:~$ mv hab-0.7.0-20160614230104-x86_64-linux/hab bin/
ubuntu@ubuntu-xenial:~$

ubuntu@ubuntu-xenial:~$ export PATH=$PATH:~/bin
ubuntu@ubuntu-xenial:~$

以降、sudo コマンドを使って hab コマンドを実行していくのですが、sudo コマンドの設定によっては PATH 環境変数が引き継がれないのでパスを通した意味がなくなります。本稿で用いた ubuntu/xenial64 のデフォルト設定では PATH 環境変数が引き継がれないので、毎回パスを指定しています。

では、hab setup を root 権限で実行し、Habitat の環境を作成していきましょう。

ubuntu@ubuntu-xenial:~$ sudo ~/bin/hab setup

Habitat CLI Setup
=================

  Welcome to hab setup. Let's get started.

Set up a default origin

  Every package in Habitat belongs to an origin, which indicates the
  person or organization responsible for maintaining that package. Each
  origin also has a key used to cryptographically sign packages in that
  origin.

  Selecting a default origin tells package building operations such as
  '
hab pkg build' what key should be used to sign the packages produced.
  If you do not set a default origin now, you will have to tell package
  building commands each time what origin to use.

  For more information on origins and how they are used in building
  packages, please consult the docs at
  https://www.habitat.sh/docs/build-packages-overview/

Set up a default origin? [Yes/no/quit]

まず origin と呼ばれるものを設定します。これは Habitat で作成するパッケージの所属先(個人または組織)であり、暗号署名を施す鍵を所持します。ここでは hab コマンドを実行する際にデフォルトで利用する origin を新規作成していきます。

  Enter the name of your origin. If you plan to publish your packages
  publicly, we recommend that you select one that is not already in use on
  the Habitat build service found at https://app.habitat.sh/.

Default origin name: [default: ubuntu] cl-lab-k

origin の名前をここでは cl-lab-k としています。

Create origin key pair

  It doesn't look like you have a signing key for the origin `cl-lab-k'.
  Without it, you won't be able to build new packages successfully.

  You can either create a new signing key now, or, if you are building
  packages for an origin that already exists, ask the owner to give you
  the signing key.

  For more information on the use of origin keys, please consult the
  documentation at https://www.habitat.sh/docs/concepts-keys/#origin-keys

Create an origin key for `cl-lab-k'
? [Yes/no/quit]
» Generating origin key for cl-lab-k
★ Generated origin key pair cl-lab-k-20160617063426.

パッケージに暗号署名するための鍵を新規作成します。

GitHub Access Token

  While you can build and run Habitat packages without sharing them on the
  public depot, doing so allows you to collaborate with the Habitat
  community. In addition, it is how you can perform continuous deployment
  with Habitat.

  The depot uses GitHub authentication with an access token
  (https://help.github.com/articles/creating-an-access-token-for-command-line-use/).

  If you would like to share your packages on the depot, please enter your
  GitHub access token. Otherwise, just enter No.

  For more information on sharing packages on the depot, please read the
  documentation at https://www.habitat.sh/docs/share-packages-overview/

Set up a default GitHub access token? [Yes/no/quit]

GitHub との連携を行います。このチュートリアルでは実施しませんが、Habitat で作成したパッケージを他者と共有する際に利用します。以後のことを考えて、ここでは連携することとします。

  Enter your GitHub access token.

GitHub access token:  ****************************************

Creating an access token for command-line use を参考に、GitHub アクセストークンを取得し、hab コマンドに入力します。

Analytics

  The `hab` command-line tool will optionally send anonymous usage data to
  Habitat's Google Analytics account. This is a strictly opt-in activity
  and no tracking will occur unless you respond affirmatively to the
  question below.

  We collect this data to help improve Habitat'
s user experience. For
  example, we would like to know the category of tasks users are
  performing, and which ones they are having trouble with (e.g. mistyping
  command line arguments).

  To see what kinds of data are sent and how they are anonymized, please
  read more about our analytics here:
  https://www.habitat.sh/docs/about-analytics/

Enable analytics? [Yes/no/quit]  
» Opting in to analytics
☑ Creating /home/ubuntu/.hab/cache/analytics/OPTED_IN
★ Analytics opted in, thank you!

hab コマンドには Google Analytics が内蔵されていて、匿名の利用統計を収集するようになっています。ここでは、今後の Habitat の開発に寄与することを期待して有効にしています。

CLI Setup Complete

  That's all for now. Thanks for using Habitat!

ubuntu@ubuntu-xenial:~$

以上で設定は完了です。

ソースの確認

Review the source files は今回のチュートリアルで利用する Node.js アプリのソースです。後々ダウンロードと設定を行うのでこれらをファイルに書く必要はありません。

プランの作成

Create your first plan に従い、前述の Node.js アプリの Habitat パッケージを作成します。

まず、Habitat パッケージに含まれるファイルや、パッケージの設計図とも言えるプランを配置するディレクトリを作成します。ここでは plans ディレクトリ以下に mytutorialapp ディレクトリを作成し、そちらで作業します。この mytutorialapp ディレクトリ内のファイルは Docker と同じく「コンテキスト (context)」と呼びます。

ubuntu@ubuntu-xenial:~$ mkdir -p ~/plans/mytutorialapp
ubuntu@ubuntu-xenial:~$ cd ~/plans/mytutorialapp/
ubuntu@ubuntu-xenial:~/plans/mytutorialapp$

mytutorialapp ディレクトリ内にプランである plan.sh ファイルを作成します。

ubuntu@ubuntu-xenial:~/plans/mytutorialapp$ vi plan.sh
pkg_origin=cl-lab-k
pkg_name=mytutorialapp
pkg_version=0.1.0
pkg_maintainer="HIGUCHI Daisuke <d-higuchi@creationline.com>"
pkg_license=()
pkg_source=https://s3-us-west-2.amazonaws.com/${pkg_name}/${pkg_name}-${pkg_version}.tar.gz
pkg_shasum=b54f8ada292b0249245385996221751f571e170162e0d464a26b958478cc9bfa
pkg_deps=(core/node)
pkg_expose=(8080)

do_build() {
  # The mytutorialapp source code is unpacked into a directory,
  # mytutorialapp-0.1.0, at the root of $HAB_CACHE_SRC_PATH. If you were downloading
  # an archive that didn't match your package name and version, you would have to
  # copy the files into $HAB_CACHE_SRC_PATH.

  # This installs both npm as well as the nconf module we listed as a
  # dependency in package.json.
  npm install
}

do_install() {
  # Our source files were copied over to the HAB_CACHE_SRC_PATH in do_build(),
  # so now they need to be copied into the root directory of our package through
  # the pkg_prefix variable. This is so that we have the source files available
  # in the package.
  cp package.json ${pkg_prefix}
  cp server.js ${pkg_prefix}

  # Copy over the nconf module to the package that we installed in do_build().
  mkdir -p ${pkg_prefix}/node_modules/
  cp -vr node_modules/* ${pkg_prefix}/node_modules/
}
ubuntu@ubuntu-xenial:~/plans/mytutorialapp$

pkg_origin, pkg_name, pkg_version

パッケージの識別情報です。

pkg_maintainer, pkg_license

メンテナの連絡先とパッケージのライセンスです。

pkg_source, pkg_shasum

ソースアーカイブの取得先と、ソースアーカイブが正しいことを検証するための SHA256 チェックサムです。一致しない場合はビルドエラーになります。

pkg_deps, pkg_build_deps

パッケージのアプリの実行時と、ビルド時のそれぞれの依存関係です。

親子関係にある依存関係をすべて列挙する必要はありません。また、実行時の依存関係はビルド時にもインストールされるので、pkg_build_deps は省略可能な場合もあります。

pkg_bin_dirs, pkg_include_dirs, pkg_lib_dirs

パッケージをビルドして配置するバイナリ、インクルード、ライブラリの各ディレクトリの定義です。

pkg_expose

指定のポートを公開します。

do_build, do_install

ビルドおよびインストール時の既存のコールバック関数を上書きします。

これでプランの作成ができたので、これをもとにして Habitat パッケージの作成を行います。クリーンな環境でパッケージの作成を行うため、「スタジオ (studio)」を起動します。root 権限で hab studio enter を実行します。

ubuntu@ubuntu-xenial:~/plans/mytutorialapp$ sudo ~/bin/hab studio enter
∵ Package for core/hab-studio not found, installing
» Installing core/hab-studio
↓ Downloading core/hab-studio/0.7.0/20160614232531
    2.72 MB / 2.72 MB | [================================] 100.00 % 16.37 MB/s  ↓ Downloading core-20160612031944 public origin key
    75 B / 75 B | [=======================================] 100.00 % 3.29 MB/s  ☑ Cached core-20160612031944 public origin key
✓ Installed core/hab-studio/0.7.0/20160614232531
★ Install of core/hab-studio complete with 1 packages installed.
   hab-studio: Creating Studio at /hab/studios/home--ubuntu--plans--mytutorialapp (default)
» Installing core/hab-backline
↓ Downloading core/acl/2.2.52/20160612075215
    181.20 KB / 181.20 KB - [=============================] 100.00 % 2.83 MB/s  ↓ Downloading core-20160612031944 public origin key
    75 B / 75 B | [=======================================] 100.00 % 4.01 MB/s  ☑ Cached core-20160612031944 public origin key
✓ Installed core/acl/2.2.52/20160612075215
↓ Downloading core/attr/2.4.47/20160612075207
    105.01 KB / 105.01 KB / [=============================] 100.00 % 1.68 MB/s  ✓ Installed core/attr/2.4.47/20160612075207
↓ Downloading core/bash/4.3.42/20160612075613
    1.07 MB / 1.07 MB | [=================================] 100.00 % 8.55 MB/s  ✓ Installed core/bash/4.3.42/20160612075613
↓ Downloading core/binutils/2.25.1/20160612064534
    2.87 MB / 2.87 MB \ [=================================] 100.00 % 1.71 MB/s  ✓ Installed core/binutils/2.25.1/20160612064534
↓ Downloading core/bzip2/1.0.6/20160612075040
    141.05 KB / 141.05 KB / [=============================] 100.00 % 2.25 MB/s  ✓ Installed core/bzip2/1.0.6/20160612075040
↓ Downloading core/cacerts/2016.04.20/20160612081125
    132.32 KB / 132.32 KB | [=============================] 100.00 % 2.08 MB/s  ✓ Installed core/cacerts/2016.04.20/20160612081125
↓ Downloading core/coreutils/8.24/20160612075329
    2.12 MB / 2.12 MB | [================================] 100.00 % 13.88 MB/s  ✓ Installed core/coreutils/8.24/20160612075329
↓ Downloading core/diffutils/3.3/20160612080306
    139.21 KB / 139.21 KB / [=============================] 100.00 % 2.19 MB/s  ✓ Installed core/diffutils/3.3/20160612080306
↓ Downloading core/file/5.24/20160612064523
    223.85 KB / 223.85 KB | [=============================] 100.00 % 2.65 MB/s  ✓ Installed core/file/5.24/20160612064523
↓ Downloading core/findutils/4.4.2/20160612080341
    384.35 KB / 384.35 KB | [=============================] 100.00 % 4.44 MB/s  ✓ Installed core/findutils/4.4.2/20160612080341
↓ Downloading core/gawk/4.1.3/20160612075739
    778.38 KB / 778.38 KB / [============================] 100.00 % 99.50 KB/s  ✓ Installed core/gawk/4.1.3/20160612075739
↓ Downloading core/gcc-libs/5.2.0/20160612075020
    2.06 MB / 2.06 MB | [================================] 100.00 % 13.43 MB/s  ✓ Installed core/gcc-libs/5.2.0/20160612075020
↓ Downloading core/glibc/2.22/20160612063629
    16.21 MB / 16.21 MB \ [==============================] 100.00 % 51.76 MB/s  ✓ Installed core/glibc/2.22/20160612063629
↓ Downloading core/gmp/6.1.0/20160612064724
    373.35 KB / 373.35 KB - [=============================] 100.00 % 3.59 MB/s  ✓ Installed core/gmp/6.1.0/20160612064724
↓ Downloading core/grep/2.22/20160612075540
    188.02 KB / 188.02 KB \ [=============================] 100.00 % 2.95 MB/s  ✓ Installed core/grep/2.22/20160612075540
↓ Downloading core/gzip/1.6/20160612080637
    75.67 KB / 75.67 KB / [===============================] 100.00 % 1.78 MB/s  ✓ Installed core/gzip/1.6/20160612080637
↓ Downloading core/hab-plan-build/0.7.0/20160614232259
    20.83 KB / 20.83 KB | [============================] 100.00 % 1004.70 KB/s  ✓ Installed core/hab-plan-build/0.7.0/20160614232259
↓ Downloading core/hab/0.7.0/20160614230104
    2.23 MB / 2.23 MB / [================================] 100.00 % 14.23 MB/s  ✓ Installed core/hab/0.7.0/20160614230104
↓ Downloading core/less/481/20160612080021
    93.72 KB / 93.72 KB \ [===============================] 100.00 % 2.19 MB/s  ✓ Installed core/less/481/20160612080021
↓ Downloading core/libbsd/0.8.1/20160612082555
    96.21 KB / 96.21 KB | [===============================] 100.00 % 1.56 MB/s  ✓ Installed core/libbsd/0.8.1/20160612082555
↓ Downloading core/libcap/2.24/20160612075226
    68.01 KB / 68.01 KB | [===============================] 100.00 % 1.60 MB/s  ✓ Installed core/libcap/2.24/20160612075226
↓ Downloading core/libidn/1.32/20160612081104
    147.93 KB / 147.93 KB - [=============================] 100.00 % 2.31 MB/s  ✓ Installed core/libidn/1.32/20160612081104
↓ Downloading core/linux-headers/4.3/20160612063537
    798.92 KB / 798.92 KB \ [=============================] 100.00 % 7.19 MB/s  ✓ Installed core/linux-headers/4.3/20160612063537
↓ Downloading core/make/4.1/20160612080650
    346.92 KB / 346.92 KB \ [=============================] 100.00 % 3.97 MB/s  ✓ Installed core/make/4.1/20160612080650
↓ Downloading core/mg/20160118/20160612082604
    139.06 KB / 139.06 KB / [=============================] 100.00 % 2.21 MB/s  ✓ Installed core/mg/20160118/20160612082604
↓ Downloading core/mpfr/3.1.4/20160612064810
    315.55 KB / 315.55 KB \ [=============================] 100.00 % 3.67 MB/s  ✓ Installed core/mpfr/3.1.4/20160612064810
↓ Downloading core/ncurses/6.0/20160612075116
    920.18 KB / 920.18 KB \ [=============================] 100.00 % 7.07 MB/s  ✓ Installed core/ncurses/6.0/20160612075116
↓ Downloading core/openssl/1.0.2h/20160612081127
    2.10 MB / 2.10 MB | [================================] 100.00 % 13.65 MB/s  ✓ Installed core/openssl/1.0.2h/20160612081127
↓ Downloading core/pcre/8.38/20160612075520
    723.64 KB / 723.64 KB - [=============================] 100.00 % 6.54 MB/s  ✓ Installed core/pcre/8.38/20160612075520
↓ Downloading core/readline/6.3.8/20160612075601
    272.38 KB / 272.38 KB - [=============================] 100.00 % 3.25 MB/s  ✓ Installed core/readline/6.3.8/20160612075601
↓ Downloading core/sed/4.2.2/20160612075228
    123.17 KB / 123.17 KB \ [=============================] 100.00 % 1.98 MB/s  ✓ Installed core/sed/4.2.2/20160612075228
↓ Downloading core/tar/1.28/20160612075701
    599.48 KB / 599.48 KB \ [=============================] 100.00 % 5.55 MB/s  ✓ Installed core/tar/1.28/20160612075701
↓ Downloading core/unzip/6.0/20160612081414
    114.17 KB / 114.17 KB - [=============================] 100.00 % 1.84 MB/s  ✓ Installed core/unzip/6.0/20160612081414
↓ Downloading core/util-linux/2.27.1/20160612080758
    2.02 MB / 2.02 MB - [================================] 100.00 % 13.16 MB/s  ✓ Installed core/util-linux/2.27.1/20160612080758
↓ Downloading core/vim/7.4.1089/20160612082510
    4.95 MB / 4.95 MB / [================================] 100.00 % 21.73 MB/s  ✓ Installed core/vim/7.4.1089/20160612082510
↓ Downloading core/wget/1.16.3/20160612081342
    436.12 KB / 436.12 KB - [=============================] 100.00 % 4.17 MB/s  ✓ Installed core/wget/1.16.3/20160612081342
↓ Downloading core/xz/5.2.2/20160612080402
    247.38 KB / 247.38 KB \ [=============================] 100.00 % 2.94 MB/s  ✓ Installed core/xz/5.2.2/20160612080402
↓ Downloading core/zlib/1.2.8/20160612064520
    73.06 KB / 73.06 KB / [===============================] 100.00 % 1.72 MB/s  ✓ Installed core/zlib/1.2.8/20160612064520
↓ Downloading core/hab-backline/0.7.0/20160614232423
    1.93 KB / 1.93 KB / [================================] 100.00 % 27.07 MB/s  ✓ Installed core/hab-backline/0.7.0/20160614232423
★ Install of core/hab-backline complete with 39 packages installed.
» Symlinking hab from core/hab into /hab/studios/home--ubuntu--plans--mytutorialapp/hab/bin
★ Binary hab from core/hab/0.7.0/20160614230104 symlinked to /hab/studios/home--ubuntu--plans--mytutorialapp/hab/bin/hab
» Symlinking bash from core/bash into /hab/studios/home--ubuntu--plans--mytutorialapp/bin
★ Binary bash from core/bash/4.3.42/20160612075613 symlinked to /hab/studios/home--ubuntu--plans--mytutorialapp/bin/bash
» Symlinking sh from core/bash into /hab/studios/home--ubuntu--plans--mytutorialapp/bin
★ Binary sh from core/bash/4.3.42/20160612075613 symlinked to /hab/studios/home--ubuntu--plans--mytutorialapp/bin/sh
   hab-studio: Entering Studio at /hab/studios/home--ubuntu--plans--mytutorialapp (default)
   hab-studio: Exported: HAB_ORIGIN=cl-lab-k

[1][default:/src:0]#

スタジオに必要な Habitat パッケージをダウンロードしてクリーンな環境を作成しています。

他のターミナルからプロセスを見てみると次のようになっています。

ubuntu@ubuntu-xenial:~$ ps axwwwf
    :
 1412 pts/0    Ss     0:00  |       \_ -bash
 1607 pts/0    S      0:00  |           \_ sudo /home/ubuntu/bin/hab studio enter
 1608 pts/0    S+     0:00  |               \_ /hab/pkgs/core/bash/4.3.42/20160612075613/bin/bash --login +h
    :
ubuntu@ubuntu-xenial:~$

マウント状況を見てみます。

ubuntu@ubuntu-xenial:~$ mount | grep hab
udev on /hab/studios/home--ubuntu--plans--mytutorialapp/dev type devtmpfs (rw,nosuid,relatime,size=4068656k,nr_inodes=1017164,mode=755)
devpts on /hab/studios/home--ubuntu--plans--mytutorialapp/dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
proc on /hab/studios/home--ubuntu--plans--mytutorialapp/proc type proc (rw,relatime)
sysfs on /hab/studios/home--ubuntu--plans--mytutorialapp/sys type sysfs (rw,relatime)
tmpfs on /hab/studios/home--ubuntu--plans--mytutorialapp/run type tmpfs (rw,relatime)
tmpfs on /hab/studios/home--ubuntu--plans--mytutorialapp/var/run/docker.sock type tmpfs (rw,nosuid,noexec,relatime,size=817548k,mode=755)
/dev/sda1 on /hab/studios/home--ubuntu--plans--mytutorialapp/src type ext4 (rw,relatime,data=ordered)
ubuntu@ubuntu-xenial:~$

スタジオ内で build コマンドを実行すると、プランに従って Habitat パッケージの作成が行われます。

[1][default:/src:0]# build
   : Loading /src/plan.sh
   mytutorialapp: Plan loaded
   mytutorialapp: hab-plan-build setup
   mytutorialapp: Using HAB_BIN=/hab/pkgs/core/hab/0.7.0/20160614230104/bin/hab for installs, signing, and hashing
   mytutorialapp: Resolving dependencies
» Installing core/node
→ Using core/gcc-libs/5.2.0/20160612075020
→ Using core/glibc/2.22/20160612063629
→ Using core/linux-headers/4.3/20160612063537
↓ Downloading core/node/4.2.6/20160612143531
    6.44 MB / 6.44 MB \ [================================] 100.00 % 28.91 MB/s  ✓ Installed core/node/4.2.6/20160612143531
★ Install of core/node complete with 4 packages installed.
   mytutorialapp: Resolved dependency 'core/node' to /hab/pkgs/core/node/4.2.6/20160612143531
   mytutorialapp: Setting PATH=/hab/pkgs/core/node/4.2.6/20160612143531/bin:/hab/pkgs/core/hab-plan-build/0.7.0/20160614232259/bin:/hab/pkgs/core/bash/4.3.42/20160612075613/bin:/hab/pkgs/core/binutils/2.25.1/20160612064534/bin:/hab/pkgs/core/bzip2/1.0.6/20160612075040/bin:/hab/pkgs/core/coreutils/8.24/20160612075329/bin:/hab/pkgs/core/file/5.24/20160612064523/bin:/hab/pkgs/core/findutils/4.4.2/20160612080341/bin:/hab/pkgs/core/gawk/4.1.3/20160612075739/bin:/hab/pkgs/core/grep/2.22/20160612075540/bin:/hab/pkgs/core/gzip/1.6/20160612080637/bin:/hab/pkgs/core/hab/0.7.0/20160614230104/bin:/hab/pkgs/core/sed/4.2.2/20160612075228/bin:/hab/pkgs/core/tar/1.28/20160612075701/bin:/hab/pkgs/core/unzip/6.0/20160612081414/bin:/hab/pkgs/core/wget/1.16.3/20160612081342/bin:/hab/pkgs/core/xz/5.2.2/20160612080402/bin:/hab/pkgs/core/acl/2.2.52/20160612075215/bin:/hab/pkgs/core/attr/2.4.47/20160612075207/bin:/hab/pkgs/core/glibc/2.22/20160612063629/bin:/hab/pkgs/core/less/481/20160612080021/bin:/hab/pkgs/core/libcap/2.24/20160612075226/bin:/hab/pkgs/core/libidn/1.32/20160612081104/bin:/hab/pkgs/core/ncurses/6.0/20160612075116/bin:/hab/pkgs/core/openssl/1.0.2h/20160612081127/bin:/hab/pkgs/core/pcre/8.38/20160612075520/bin
mkdir: created directory '/hab/cache/src'
   mytutorialapp: Downloading 'https://s3-us-west-2.amazonaws.com/mytutorialapp/mytutorialapp-0.1.0.tar.gz' to 'mytutorialapp-0.1.0.tar.gz'
--2016-06-17 08:56:17--  https://s3-us-west-2.amazonaws.com/mytutorialapp/mytutorialapp-0.1.0.tar.gz
Resolving s3-us-west-2.amazonaws.com (s3-us-west-2.amazonaws.com)... 54.231.184.132
Connecting to s3-us-west-2.amazonaws.com (s3-us-west-2.amazonaws.com)|54.231.184.132|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1041 (1.0K) [application/x-gzip]
Saving to: 'mytutorialapp-0.1.0.tar.gz'

mytutorialapp-0.1.0 100%[=====================>]   1.02K  --.-KB/s   in 0s    

2016-06-17 08:56:18 (72.6 MB/s) - 'mytutorialapp-0.1.0.tar.gz' saved [1041/1041]

   mytutorialapp: Downloaded 'mytutorialapp-0.1.0.tar.gz'
   mytutorialapp: Verifying mytutorialapp-0.1.0.tar.gz
   mytutorialapp: Checksum verified for mytutorialapp-0.1.0.tar.gz
   mytutorialapp: Clean the cache
   mytutorialapp: Unpacking mytutorialapp-0.1.0.tar.gz
   mytutorialapp: Setting build environment
   mytutorialapp: Setting PREFIX=/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614
   mytutorialapp: Setting LD_RUN_PATH=/hab/pkgs/core/node/4.2.6/20160612143531/lib
   mytutorialapp: Setting CFLAGS=-I/hab/pkgs/core/node/4.2.6/20160612143531/include
   mytutorialapp: Setting LDFLAGS=-L/hab/pkgs/core/node/4.2.6/20160612143531/lib
   mytutorialapp: Preparing to build
   mytutorialapp: Building
npm WARN package.json mytutorialapp@0.1.0 No repository field.
npm WARN package.json mytutorialapp@0.1.0 No README data
nconf@0.8.4 node_modules/nconf
├── ini@1.3.4
├── secure-keys@1.0.0
├── async@1.5.2
└── yargs@3.32.0 (decamelize@1.2.0, camelcase@2.1.1, y18n@3.2.1, window-size@0.1.4, os-locale@1.4.0, cliui@3.2.0, string-width@1.0.1)
   mytutorialapp: Installing
'node_modules/nconf' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf'
'node_modules/nconf/.npmignore' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/.npmignore'
'node_modules/nconf/README.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/README.md'
'node_modules/nconf/LICENSE' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/LICENSE'
'node_modules/nconf/usage.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/usage.js'
'node_modules/nconf/CHANGELOG.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/CHANGELOG.md'
'node_modules/nconf/lib' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib'
'node_modules/nconf/lib/nconf.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf.js'
'node_modules/nconf/lib/nconf' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf'
'node_modules/nconf/lib/nconf/common.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/common.js'
'node_modules/nconf/lib/nconf/formats.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/formats.js'
'node_modules/nconf/lib/nconf/provider.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/provider.js'
'node_modules/nconf/lib/nconf/stores' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/stores'
'node_modules/nconf/lib/nconf/stores/argv.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/stores/argv.js'
'node_modules/nconf/lib/nconf/stores/env.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/stores/env.js'
'node_modules/nconf/lib/nconf/stores/file.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/stores/file.js'
'node_modules/nconf/lib/nconf/stores/literal.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/stores/literal.js'
'node_modules/nconf/lib/nconf/stores/memory.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/lib/nconf/stores/memory.js'
'node_modules/nconf/.travis.yml' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/.travis.yml'
'node_modules/nconf/test' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test'
'node_modules/nconf/test/common-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/common-test.js'
'node_modules/nconf/test/complete-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/complete-test.js'
'node_modules/nconf/test/helpers.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/helpers.js'
'node_modules/nconf/test/hierarchy-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/hierarchy-test.js'
'node_modules/nconf/test/nconf-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/nconf-test.js'
'node_modules/nconf/test/provider-save-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/provider-save-test.js'
'node_modules/nconf/test/provider-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/provider-test.js'
'node_modules/nconf/test/fixtures' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures'
'node_modules/nconf/test/fixtures/data.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/data.js'
'node_modules/nconf/test/fixtures/bom.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/bom.json'
'node_modules/nconf/test/fixtures/complete.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/complete.json'
'node_modules/nconf/test/fixtures/hierarchy' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/hierarchy'
'node_modules/nconf/test/fixtures/hierarchy/global.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/hierarchy/global.json'
'node_modules/nconf/test/fixtures/hierarchy/hierarchical.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/hierarchy/hierarchical.json'
'node_modules/nconf/test/fixtures/hierarchy/user.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/hierarchy/user.json'
'node_modules/nconf/test/fixtures/malformed.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/malformed.json'
'node_modules/nconf/test/fixtures/merge' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/merge'
'node_modules/nconf/test/fixtures/merge/file1.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/merge/file1.json'
'node_modules/nconf/test/fixtures/merge/file2.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/merge/file2.json'
'node_modules/nconf/test/fixtures/no-bom.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/no-bom.json'
'node_modules/nconf/test/fixtures/scripts' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts'
'node_modules/nconf/test/fixtures/scripts/nconf-argv.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/nconf-argv.js'
'node_modules/nconf/test/fixtures/scripts/nconf-change-argv.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/nconf-change-argv.js'
'node_modules/nconf/test/fixtures/scripts/nconf-env.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/nconf-env.js'
'node_modules/nconf/test/fixtures/scripts/nconf-hierarchical-file-argv.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/nconf-hierarchical-file-argv.js'
'node_modules/nconf/test/fixtures/scripts/nconf-hierarchical-load-merge.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/nconf-hierarchical-load-merge.js'
'node_modules/nconf/test/fixtures/scripts/nconf-hierarchical-load-save.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/nconf-hierarchical-load-save.js'
'node_modules/nconf/test/fixtures/scripts/nconf-nested-env.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/nconf-nested-env.js'
'node_modules/nconf/test/fixtures/scripts/provider-argv.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/provider-argv.js'
'node_modules/nconf/test/fixtures/scripts/provider-env.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/scripts/provider-env.js'
'node_modules/nconf/test/fixtures/secure.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/fixtures/secure.json'
'node_modules/nconf/test/mocks' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/mocks'
'node_modules/nconf/test/mocks/mock-store.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/mocks/mock-store.js'
'node_modules/nconf/test/stores' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/stores'
'node_modules/nconf/test/stores/argv-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/stores/argv-test.js'
'node_modules/nconf/test/stores/env-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/stores/env-test.js'
'node_modules/nconf/test/stores/file-store-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/stores/file-store-test.js'
'node_modules/nconf/test/stores/literal-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/stores/literal-test.js'
'node_modules/nconf/test/stores/memory-store-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/test/stores/memory-store-test.js'
'node_modules/nconf/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/package.json'
'node_modules/nconf/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules'
'node_modules/nconf/node_modules/async' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async'
'node_modules/nconf/node_modules/async/README.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/README.md'
'node_modules/nconf/node_modules/async/LICENSE' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/LICENSE'
'node_modules/nconf/node_modules/async/CHANGELOG.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/CHANGELOG.md'
'node_modules/nconf/node_modules/async/dist' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/dist'
'node_modules/nconf/node_modules/async/dist/async.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/dist/async.js'
'node_modules/nconf/node_modules/async/dist/async.min.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/dist/async.min.js'
'node_modules/nconf/node_modules/async/lib' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/lib'
'node_modules/nconf/node_modules/async/lib/async.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/lib/async.js'
'node_modules/nconf/node_modules/async/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/async/package.json'
'node_modules/nconf/node_modules/yargs' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs'
'node_modules/nconf/node_modules/yargs/locales' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales'
'node_modules/nconf/node_modules/yargs/locales/id.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/id.json'
'node_modules/nconf/node_modules/yargs/locales/es.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/es.json'
'node_modules/nconf/node_modules/yargs/locales/nb.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/nb.json'
'node_modules/nconf/node_modules/yargs/locales/de.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/de.json'
'node_modules/nconf/node_modules/yargs/locales/fr.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/fr.json'
'node_modules/nconf/node_modules/yargs/locales/ja.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/ja.json'
'node_modules/nconf/node_modules/yargs/locales/ko.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/ko.json'
'node_modules/nconf/node_modules/yargs/locales/en.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/en.json'
'node_modules/nconf/node_modules/yargs/locales/pirate.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/pirate.json'
'node_modules/nconf/node_modules/yargs/locales/pl.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/pl.json'
'node_modules/nconf/node_modules/yargs/locales/pt.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/pt.json'
'node_modules/nconf/node_modules/yargs/locales/pt_BR.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/pt_BR.json'
'node_modules/nconf/node_modules/yargs/locales/tr.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/tr.json'
'node_modules/nconf/node_modules/yargs/locales/zh.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/locales/zh.json'
'node_modules/nconf/node_modules/yargs/README.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/README.md'
'node_modules/nconf/node_modules/yargs/LICENSE' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/LICENSE'
'node_modules/nconf/node_modules/yargs/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/index.js'
'node_modules/nconf/node_modules/yargs/completion.sh.hbs' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/completion.sh.hbs'
'node_modules/nconf/node_modules/yargs/CHANGELOG.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/CHANGELOG.md'
'node_modules/nconf/node_modules/yargs/lib' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/lib'
'node_modules/nconf/node_modules/yargs/lib/validation.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/lib/validation.js'
'node_modules/nconf/node_modules/yargs/lib/tokenize-arg-string.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/lib/tokenize-arg-string.js'
'node_modules/nconf/node_modules/yargs/lib/completion.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/lib/completion.js'
'node_modules/nconf/node_modules/yargs/lib/parser.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/lib/parser.js'
'node_modules/nconf/node_modules/yargs/lib/usage.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/lib/usage.js'
'node_modules/nconf/node_modules/yargs/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/package.json'
'node_modules/nconf/node_modules/yargs/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/.bin' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/.bin'
'node_modules/nconf/node_modules/yargs/node_modules/.bin/window-size' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/.bin/window-size'
'node_modules/nconf/node_modules/yargs/node_modules/camelcase' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/camelcase'
'node_modules/nconf/node_modules/yargs/node_modules/camelcase/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/camelcase/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/camelcase/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/camelcase/license'
'node_modules/nconf/node_modules/yargs/node_modules/camelcase/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/camelcase/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/camelcase/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/camelcase/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/cliui' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/README.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/README.md'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/LICENSE.txt' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/LICENSE.txt'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/CHANGELOG.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/CHANGELOG.md'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/license'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/license'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/license'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/license'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/lcid.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/lcid.json'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/license'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules/invert-kv' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules/invert-kv'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules/invert-kv/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules/invert-kv/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules/invert-kv/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules/invert-kv/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules/invert-kv/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/os-locale/node_modules/lcid/node_modules/invert-kv/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/decamelize' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/decamelize'
'node_modules/nconf/node_modules/yargs/node_modules/decamelize/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/decamelize/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/decamelize/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/decamelize/license'
'node_modules/nconf/node_modules/yargs/node_modules/decamelize/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/decamelize/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/decamelize/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/decamelize/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/string-width' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/license'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/license'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/license'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/license'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/license'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/license'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/license' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/license'
'node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/readme.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/readme.md'
'node_modules/nconf/node_modules/yargs/node_modules/y18n' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/y18n'
'node_modules/nconf/node_modules/yargs/node_modules/y18n/README.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/y18n/README.md'
'node_modules/nconf/node_modules/yargs/node_modules/y18n/LICENSE' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/y18n/LICENSE'
'node_modules/nconf/node_modules/yargs/node_modules/y18n/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/y18n/index.js'
'node_modules/nconf/node_modules/yargs/node_modules/y18n/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/y18n/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/window-size' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/window-size'
'node_modules/nconf/node_modules/yargs/node_modules/window-size/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/window-size/package.json'
'node_modules/nconf/node_modules/yargs/node_modules/window-size/README.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/window-size/README.md'
'node_modules/nconf/node_modules/yargs/node_modules/window-size/LICENSE' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/window-size/LICENSE'
'node_modules/nconf/node_modules/yargs/node_modules/window-size/cli.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/window-size/cli.js'
'node_modules/nconf/node_modules/yargs/node_modules/window-size/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/yargs/node_modules/window-size/index.js'
'node_modules/nconf/node_modules/secure-keys' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys'
'node_modules/nconf/node_modules/secure-keys/.npmignore' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys/.npmignore'
'node_modules/nconf/node_modules/secure-keys/README.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys/README.md'
'node_modules/nconf/node_modules/secure-keys/index.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys/index.js'
'node_modules/nconf/node_modules/secure-keys/.travis.yml' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys/.travis.yml'
'node_modules/nconf/node_modules/secure-keys/test' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys/test'
'node_modules/nconf/node_modules/secure-keys/test/test.secret.key' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys/test/test.secret.key'
'node_modules/nconf/node_modules/secure-keys/test/simple-test.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys/test/simple-test.js'
'node_modules/nconf/node_modules/secure-keys/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/secure-keys/package.json'
'node_modules/nconf/node_modules/ini' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/ini'
'node_modules/nconf/node_modules/ini/README.md' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/ini/README.md'
'node_modules/nconf/node_modules/ini/LICENSE' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/ini/LICENSE'
'node_modules/nconf/node_modules/ini/ini.js' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/ini/ini.js'
'node_modules/nconf/node_modules/ini/package.json' -> '/hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/node_modules/nconf/node_modules/ini/package.json'
   mytutorialapp: Writing configuration
   mytutorialapp: Writing service management scripts
   mytutorialapp: Stripping unneeded symbols from binaries and libraries
   mytutorialapp: Creating manifest
   mytutorialapp: Building package metadata
   mytutorialapp: Generating blake2b hashes of all files in the package
   mytutorialapp: Generating signed metadata FILES
» Signing mytutorialapp_blake2bsums
☛ Signing mytutorialapp_blake2bsums with cl-lab-k-20160617085430 to create /hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/FILES
★ Signed artifact /hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/FILES.
   mytutorialapp: Generating package artifact
/hab/pkgs/core/tar/1.28/20160612075701/bin/tar: Removing leading `/' from member names
/hab/cache/artifacts/.cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.tar (1/1)
  100 %       121.2 KiB / 900.0 KiB = 0.135                                    
» Signing /hab/cache/artifacts/.cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.tar.xz
☛ Signing /hab/cache/artifacts/.cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.tar.xz with cl-lab-k-20160617085430 to create /hab/cache/artifacts/cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.hart
★ Signed artifact /hab/cache/artifacts/cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.hart.
mkdir: created directory '
/src/results'
'
/hab/cache/artifacts/cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.hart' -> '/src/results/cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.hart'
   mytutorialapp: hab-plan-build cleanup
   mytutorialapp:
   mytutorialapp: Source Cache: /hab/cache/src/mytutorialapp-0.1.0
   mytutorialapp: Installed Path: /hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614
   mytutorialapp: Artifact: /src/results/cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.hart
   mytutorialapp: Build Report: /src/results/last_build.env
   mytutorialapp: SHA256 Checksum: 4b21b5301bca3f00d901bfa6916abecd6f51229c348dfcc3399e75c715248c45
   mytutorialapp: Blake2b Checksum: 9859c9823f59a909047c1652896425ad88002dbfb803e853a4d32e59690d5e2e
   mytutorialapp:
   mytutorialapp: I love it when a plan.sh comes together.
   mytutorialapp:
   mytutorialapp: Build time: 0m8s
[2][default:/src:0]#

ソースファイルは /hab/pkgs ディレクトリ以下に、さらに origin、パッケージ名、パッケージバージョン、リリース番号のディレクトリを作成して格納されます。

[6][default:/src:0]# ls /hab/pkgs/cl-lab-k/mytutorialapp/0.1.0/20160617085614/
DEPS     FILES  MANIFEST  TDEPS  node_modules  server.js
EXPOSES  IDENT  TARGET    etc    package.json
[7][default:/src:0]#

パッケージファイルは /hab/results ディレクトリ以下に格納されます。

[7][default:/src:0]# ls /src/results/
/src/results/cl-lab-k-mytutorialapp-0.1.0-20160617085614-x86_64-linux.hart
[8][default:/src:0]#

フックの追加

先の Habitat パッケージはサービスを何も起動しないため、何も起こりません。そこで Add hooks to your plan に従い、フックスクリプトを追加します。

フックスクリプトを格納するディレクトリ /src/hooks を作成し、そちらに移動します。

[8][default:/src:0]# cd /src/
[9][default:/src:0]# mkdir hooks
[10][default:/src:0]# cd hooks/
[11][default:/src/hooks:0]#

init ファイルには初期化時の挙動を定義し、run ファイルにはサービスまたはアプリ起動方法を定義します。

[12][default:/src/hooks:0]# vi init
#!/bin/sh
#
ln -sf {{pkg.path}}/package.json {{pkg.svc_path}}
ln -sf {{pkg.path}}/server.js {{pkg.svc_path}}
ln -sf {{pkg.path}}/node_modules {{pkg.svc_path}}
[13][default:/src/hooks:0]#
[13][default:/src/hooks:0]# vi run
#!/bin/sh
#
cd {{pkg.svc_path}}
npm start
[14][default:/src/hooks:0]#

設定の追加

ここでは Add configuration to your plan に従って、設定を動的に変更できるように調整します。

まず、/src/config ディレクトリを作成し、もともとの静的な設定ファイルを作成します。

[14][default:/src/hooks:0]# cd /src/
[15][default:/src:0]# mkdir config
[16][default:/src:0]# touch config/config.json
[17][default:/src:0]#
[17][default:/src:0]# vi config/config.json
{
    "message": "Hello, World!",
    "port": "8080"
}
[18][default:/src:0]#

固定値である "Hello, World!""8080" をテンプレート変数に書き換えます。ユーザ定義値は cfg. から始まります。

[18][default:/src:0]# vi config/config.json
{
    "message": "{{cfg.message}}",
    "port": "{{cfg.port}}"
}
[19][default:/src:0]#

ユーザ定義のテンプレート変数のデフォルトは TOML (和訳) というシンプルな言語によって書かれています。

[19][default:/src:0]# touch default.toml
[20][default:/src:0]#
[20][default:/src:0]# vi default.toml
# Message of the Day
message = "Hello, World!"

# The port number that is listening for requests.
port = 8080
[21][default:/src:0]#

サービスを実行

Run your service に従い、改めて Habitat パッケージのビルドを行います。

[1][default:/src:0]# build
    :
    :
    :
[2][default:/src:0]#

hab pkg export docker コマンドを用いると、指定の Habitat パッケージを Docker イメージとして書き出すことができます。指定方法は origin/packagename です。

[2][default:/src:0]# hab pkg export docker cl-lab-k/mytutorialapp
core/hab-pkg-dockerize is not installed
Searching for core/hab-pkg-dockerize in remote https://willem.habitat.sh/v1/depot
» Installing core/hab-pkg-dockerize
→ Using core/acl/2.2.52/20160612075215
→ Using core/attr/2.4.47/20160612075207
→ Using core/bash/4.3.42/20160612075613
→ Using core/coreutils/8.24/20160612075329
↓ Downloading core/docker/1.11.2/20160612140737
    13.70 MB / 13.70 MB \ [==============================] 100.00 % 35.28 MB/s  ✓ Installed core/docker/1.11.2/20160612140737
→ Using core/findutils/4.4.2/20160612080341
→ Using core/gawk/4.1.3/20160612075739
→ Using core/gcc-libs/5.2.0/20160612075020
→ Using core/glibc/2.22/20160612063629
→ Using core/gmp/6.1.0/20160612064724
→ Using core/grep/2.22/20160612075540
↓ Downloading core/hab-studio/0.7.0/20160614232531
    2.72 MB / 2.72 MB | [================================] 100.00 % 17.08 MB/s  ✓ Installed core/hab-studio/0.7.0/20160614232531
→ Using core/libcap/2.24/20160612075226
→ Using core/linux-headers/4.3/20160612063537
→ Using core/mpfr/3.1.4/20160612064810
→ Using core/ncurses/6.0/20160612075116
→ Using core/pcre/8.38/20160612075520
→ Using core/readline/6.3.8/20160612075601
↓ Downloading core/hab-pkg-dockerize/0.7.0/20160614232839
    3.83 KB / 3.83 KB / [================================] 100.00 % 47.50 MB/s  ✓ Installed core/hab-pkg-dockerize/0.7.0/20160614232839
★ Install of core/hab-pkg-dockerize complete with 19 packages installed.
   hab-studio: Creating Studio at /tmp/hab-pkg-dockerize-JcYv/rootfs (baseimage)
> Using local package for cl-lab-k/mytutorialapp
> Using local package for core/gcc-libs/5.2.0/20160612075020 via cl-lab-k/mytutorialapp
> Using local package for core/glibc/2.22/20160612063629 via cl-lab-k/mytutorialapp
> Using local package for core/linux-headers/4.3/20160612063537 via cl-lab-k/mytutorialapp
> Using local package for core/node/4.2.6/20160612143531 via cl-lab-k/mytutorialapp
» Installing core/hab
↓ Downloading core/hab/0.7.0/20160614230104
    2.23 MB / 2.23 MB / [================================] 100.00 % 15.10 MB/s  ↓ Downloading core-20160612031944 public origin key
    75 B / 75 B | [=======================================] 100.00 % 4.23 MB/s  ☑ Cached core-20160612031944 public origin key
✓ Installed core/hab/0.7.0/20160614230104
★ Install of core/hab complete with 1 packages installed.
» Installing core/hab-sup
↓ Downloading core/busybox-static/1.24.2/20160612081725
    510.89 KB / 510.89 KB \ [=============================] 100.00 % 4.82 MB/s  ✓ Installed core/busybox-static/1.24.2/20160612081725
↓ Downloading core/bzip2/1.0.6/20160612075040
    141.05 KB / 141.05 KB / [=============================] 100.00 % 2.21 MB/s  ✓ Installed core/bzip2/1.0.6/20160612075040
↓ Downloading core/cacerts/2016.04.20/20160612081125
    132.32 KB / 132.32 KB | [=============================] 100.00 % 2.08 MB/s  ✓ Installed core/cacerts/2016.04.20/20160612081125
→ Using core/gcc-libs/5.2.0/20160612075020
→ Using core/glibc/2.22/20160612063629
↓ Downloading core/libarchive/3.2.0/20160612140528
    584.98 KB / 584.98 KB / [=============================] 100.00 % 5.36 MB/s  ✓ Installed core/libarchive/3.2.0/20160612140528
↓ Downloading core/libsodium/1.0.8/20160612140317
    187.96 KB / 187.96 KB \ [=============================] 100.00 % 2.90 MB/s  ✓ Installed core/libsodium/1.0.8/20160612140317
→ Using core/linux-headers/4.3/20160612063537
↓ Downloading core/openssl/1.0.2h/20160612081127
    2.10 MB / 2.10 MB | [================================] 100.00 % 13.55 MB/s  ✓ Installed core/openssl/1.0.2h/20160612081127
↓ Downloading core/xz/5.2.2/20160612080402
    247.38 KB / 247.38 KB \ [=============================] 100.00 % 2.87 MB/s  ✓ Installed core/xz/5.2.2/20160612080402
↓ Downloading core/zlib/1.2.8/20160612064520
    73.06 KB / 73.06 KB / [===============================] 100.00 % 1.72 MB/s  ✓ Installed core/zlib/1.2.8/20160612064520
↓ Downloading core/hab-sup/0.7.0/20160614232939
    1.54 MB / 1.54 MB | [================================] 100.00 % 10.77 MB/s  ✓ Installed core/hab-sup/0.7.0/20160614232939
★ Install of core/hab-sup complete with 12 packages installed.
» Symlinking hab from core/hab into /tmp/hab-pkg-dockerize-JcYv/rootfs/hab/bin
★ Binary hab from core/hab/0.7.0/20160614230104 symlinked to /tmp/hab-pkg-dockerize-JcYv/rootfs/hab/bin/hab
» Symlinking bash from core/busybox-static into /tmp/hab-pkg-dockerize-JcYv/rootfs/bin
★ Binary bash from core/busybox-static/1.24.2/20160612081725 symlinked to /tmp/hab-pkg-dockerize-JcYv/rootfs/bin/bash
» Symlinking sh from core/busybox-static into /tmp/hab-pkg-dockerize-JcYv/rootfs/bin
★ Binary sh from core/busybox-static/1.24.2/20160612081725 symlinked to /tmp/hab-pkg-dockerize-JcYv/rootfs/bin/sh
Sending build context to Docker daemon 194.3 MB
Step 1 : FROM scratch
 --->
Step 2 : ENV export PATH=:/hab/pkgs/core/glibc/2.22/20160612063629/bin:/hab/pkgs/core/node/4.2.6/20160612143531/bin:/hab/pkgs/core/hab-sup/0.7.0/20160614232939/bin:/hab/pkgs/core/busybox-static/1.24.2/20160612081725/bin:/hab/pkgs/core/bzip2/1.0.6/20160612075040/bin:/hab/pkgs/core/glibc/2.22/20160612063629/bin:/hab/pkgs/core/openssl/1.0.2h/20160612081127/bin:/hab/pkgs/core/xz/5.2.2/20160612080402/bin:/hab/pkgs/core/busybox-static/1.24.2/20160612081725/bin:/hab/bin
 ---> Running in b5008a720960
 ---> 60526d6b38b8
Removing intermediate container b5008a720960
Step 3 : WORKDIR /
 ---> Running in 79e0114410f4
 ---> 1f25582154fb
Removing intermediate container 79e0114410f4
Step 4 : ADD rootfs /
 ---> bf6c56e02946
Removing intermediate container bd0341eee74b
Step 5 : VOLUME /hab/svc/mytutorialapp/data /hab/svc/mytutorialapp/config
 ---> Running in 125b734f1593
 ---> 94a73fad68f4
Removing intermediate container 125b734f1593
Step 6 : EXPOSE 9631 8080
 ---> Running in 4b0a51d0a5e0
 ---> 13714b401896
Removing intermediate container 4b0a51d0a5e0
Step 7 : ENTRYPOINT /init.sh
 ---> Running in 803ea88c77af
 ---> f0584fd30c70
Removing intermediate container 803ea88c77af
Step 8 : CMD start cl-lab-k/mytutorialapp
 ---> Running in 02e330795f60
 ---> 2358112772ff
Removing intermediate container 02e330795f60
Successfully built 2358112772ff
[3][default:/src:0]#

スタジオから exit し、docker images コマンドで Docker イメージを確認します。

ubuntu@ubuntu-xenial:~$ docker images
REPOSITORY               TAG                    IMAGE ID            CREATED             SIZE
cl-lab-k/mytutorialapp   0.1.0-20160617092533   2358112772ff        38 seconds ago      187.7 MB
cl-lab-k/mytutorialapp   latest                 2358112772ff        38 seconds ago      187.7 MB
ubuntu@ubuntu-xenial:~$

この Docker イメージを docker run コマンドで起動します。

ubuntu@ubuntu-xenial:~$ docker run -it -p 8080:8080 cl-lab-k/mytutorialapp
hab-sup(MN): Starting cl-lab-k/mytutorialapp
hab-sup(GS): Supervisor 172.17.0.2: 603c7d33-f07d-41cd-be42-8d823ce51391
hab-sup(GS): Census mytutorialapp.default: ab4ef7ba-6a46-467a-a532-d45bacf67707
hab-sup(GS): Starting inbound gossip listener
hab-sup(GS): Starting outbound gossip distributor
hab-sup(GS): Starting gossip failure detector
hab-sup(CN): Starting census health adjuster
hab-sup(SC): Updated config.json
hab-sup(TP): Restarting because the service config was updated via the census
mytutorialapp(SV): Starting
mytutorialapp(O):
mytutorialapp(O): > mytutorialapp@0.1.0 start /hab/svc/mytutorialapp
mytutorialapp(O): > node server.js
mytutorialapp(O):
mytutorialapp(O): Running on http://0.0.0.0:8080

別ターミナルでアクセスしてみます。

ubuntu@ubuntu-xenial:~$ curl http://127.0.0.1:8080/
Hello, World!ubuntu@ubuntu-xenial:~$

先に設定していたデフォルトのメッセージが表示されています。

次に -e オプション で環境変数を与えて設定を上書きしてみます。

ubuntu@ubuntu-xenial:~$ docker run -e HAB_MYTUTORIALAPP='message="Habitat rocks!"' -it -p 8080:8080 cl-lab-k/mytutorialapp
hab-sup(MN): Starting cl-lab-k/mytutorialapp
    :
    :
    :
mytutorialapp(O):
mytutorialapp(O): Running on http://0.0.0.0:8080

別ターミナルでアクセスしてみます。

ubuntu@ubuntu-xenial:~$ curl http://127.0.0.1:8080/
Habitat rocks!ubuntu@ubuntu-xenial:~$

上書きしたメッセージが表示されています。

おわりに

これでチュートリアルは終了です。あくまで触りの部分だけなので、Habitat の特長についてなかなか伝わらないと思います。しかし、このチュートリアルを踏まえることで、Habitat の概念をより深く知るための手がかりになると思います。

引き続き、Habitat について追っていきたいと思います。

CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post