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

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本稿は Chef社によるアプリ自動化プロジェクト Habitat の チュートリアル を実施してみた結果です。
Vagrant + VirtualBox で ubuntu/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 を実行します。
∵ 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
スタジオに必要な 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 について追っていきたいと思います。
