14
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

app.jsonによるHeroku環境構築

app.jsonとは...?

app.jsonは Heroku 環境構成ファイルとして機能します。

今の所用途としては以下のケースが考えられます。

  • Heroku Button
  • Docker で環境構築
  • PR でアレする。

app.jsonをベースにDockerファイルを作成するのは若干挙動がおかしかったりすることもあり、
自分でcomposeファイル書くほうが良さそう。

https://devcenter.heroku.com/articles/app-json-schema
にサンプルのapp.jsonが掲載されています。

結構オプションの項目が多いので、最小構成でも全然動く。

name, description, keyword, website, repository, logo

Heroku Buttonでアプリを作成する際に表示されるオプション情報。

基本的にoptionalで省略可能。

logo は外部にホスティングされた画像のURLを指定し、SVG,PNG,JPGが使える。

success_url

アプリがデプロイされた際に表示するURL

/スタートで、アプリ自体のURLを指定する事が可能

{
  "success_url": "/welcome"
}

script

デプロイに併せて実行されるスクリプト。現在postdeploy エントリのみサポート

{
  "scripts": {
    "postdeploy": "bundle exec rake bootstrap"
  }
}

env

アプリに設定する環境変数。"generator": "secret"でrandomな値を自動生成させることが出来る。

{
  "env": {
    "SECRET_TOKEN": {
      "description": "A secret key for verifying the integrity of signed cookies.",
      "generator": "secret"
    },
    "WEB_CONCURRENCY": {
      "description": "The number of processes to run.",
      "value": "5"
    }
  }
}

formation

dynoの種類を定義する。Procfileの代わりになるものではない。

{
  "formation": {
    "web": {
      "quantity": 2,
      "size": "Performance-M"
    }
  }
}

image

Dockerで使用するイメージ名。Dockerで使用しないなら不要。

addons

使用するAddons

buildpacks

複数指定可能で、最後に記述したものがアプリケーションのタイプを規定する。

Heroku Button

Heroku App のリポジトリにapp.jsonを置いておくとHeroku Buttonの機能が使える。

プライベートリポジトリとかはNGっぽい(Heroku がデプロイ用にtarを取りに行くので)

Github 連携済みのアカウントを利用して、プライベートリポジトリにも対応可能なようです。
http://qiita.com/ryu22e/items/4d3b2e73efa1459725c1

一番簡単な設置方法は、Githubの公開リポジトリのReadmeに以下の記述を入れておくやり方。

[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)

リポジトリの情報を入れなくても、リファラからリポジトリのURLを認識して勝手に特定してくれる。

Review App

  1. パイプラインを作成して、Github連携を追加する。
  2. review app 設定を有効化する。
  3. PullRequest を作成

こちらはgithub連携機能を作成するので、Private リポジトリでも有効っぽい。

{appName}-pr-xという名前で自動的にアプリが立ち上がる。

Github側 PRの画面でもdeployの結果が表示されるあたり便利。

設定で変更可能だが、PR閉じた際に自動的にアプリを削除する事も可能。

Docker

下記の記事は2016年 01月の記事だけどもう内容が古くて実行できない。
https://devcenter.heroku.com/articles/docker

heroku-docker プラグインが herokuk-container-toolsに置き換わった模様

こちらのREADME.mdを参考にするのが良さそう
https://github.com/heroku/heroku-container-tools

コンテナの作成

$ heroku plugins:install heroku-docker
$ heroku docker:init

このコマンドでDocker fileとdocker-compose.ymlが作成される。

後はdocker daemon が起動している状態で、コンテナを立ち上げればOK

$ docker-compose up web

worker 用のコンテナも起動する場合には、workerの名前を指定してやれば良い。

なお、app.json更新の際には--forceオプションを付けてdocker ファイルなどを更新できる。

$ heroku docker:init --force

気になった点など

上手いこと利用するには、docker-composer.yml をかなり触らないと行けない。

Local HDDのマウントは デフォルトで作成されるshellの方にしか設定されていないので、

リアルタイムにWebの更新を進めようと思うとvolume設定をweb側にも追加する。

addons で設定したdatabaseなどもコンテナ設定等が追記されるものの、depends等まで上手いこと設定してくれるわけでもないので何とかしてweb側からつなぐよう設定を記述する必要あり。

あと当然全てのaddonsが対応しているわけではない。

カスタムビルドパックの設定などもapp.jsonで設定可能だが反映はされない模様?

app.json でenvの設定を空にしておくと、docker-compose.ymlに空のenvironments: エントリが作成されて、パースエラーになる(手動で [] を追加すれば治る)。

気になった点など(PHP)

Heroku環境構築では、Buildpack 設定さえすればcomposer require heroku/heroku-buildpack-php不要だったが、

docker側ではエラーが出るっぽい。

ので、dockerで環境構築する際にはdev dependency にビルドパックを追加する必要あり。

phpプロジェクトではdocker buildの際にcomposerの post-install-cmdを叩くよう。からでも良いのでエントリに追加しておく。
(composer run ではなくて、composer.jsonをpythonでパースしてシェルで叩いている。)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
14
Help us understand the problem. What are the problem?