fbpx

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

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本稿は 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></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)</d-higuchi@creationline.com>

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 について追っていきたいと思います。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA