dotcloud は環境変数として多くの有用な情報を提供しますが、環境変数にnginx.conf
アクセスできません。これを回避する良い方法は何ですか?
www
シナリオは次のとおりです。特定の URL を静的サービスからサービスにリダイレクトしたいrest
ので、現在、ターゲット URL を にハードコーディングしていますnginx.conf
。DOTCLOUD_REST_HTTP_HOST
サービスを簡単に移行できるようにするため、変数を使用したいと思います。
dotcloud は環境変数として多くの有用な情報を提供しますが、環境変数にnginx.conf
アクセスできません。これを回避する良い方法は何ですか?
www
シナリオは次のとおりです。特定の URL を静的サービスからサービスにリダイレクトしたいrest
ので、現在、ターゲット URL を にハードコーディングしていますnginx.conf
。DOTCLOUD_REST_HTTP_HOST
サービスを簡単に移行できるようにするため、変数を使用したいと思います。
これは、postinstall
サービスのスクリプトを使用する場合に適しています。dotCloud は、プッシュおよびデプロイ サイクルの各段階で実行するためのビルド フックpostinstall
を提供します。フックは最後に実行され、すべての環境変数にアクセスできます。実際の環境から、または実際の環境から変数を読み取ることができ~/environment.json
ます (歴史的な理由により、環境に入れられるものはサービスの種類によって異なる可能性があるため、ファイルはわずかに信頼性が高くなります)。
例を次に示しdotcloud.yml
ます。
www:
approot: www
type: static
environment:
LIMITRATEVAR: 2k
例nginx.conf
(www/nginx.conf にあります):
# limitratevar should get set in dotcloud.yml's environment section
# or via `dotcloud env set limitratevar` if you want to set it for all services.
# And then use a postinstall script to update this nginx.conf with sed
limit_rate LIMITRATEVAR;
最後にpostinstall
、環境から $LIMITRATEVAR の値を読み取り、nginx.conf をsed
次のように更新する例 (www/postinstall にあります)。
#!/usr/bin/env bash
# files named "postinstall" will get run automatically when the code is deployed
# to the container where your service runs.
# See:
# http://docs.dotcloud.com/guides/build-file/#prebuild-postbuild-postinstall-build-hooks
# http://docs.dotcloud.com/guides/hooks/#post-install
# Make sure we error-out if there are any problems
set -e
echo "Updating the limit_rate to $LIMITRATEVAR"
sed -i.original "s/LIMITRATEVAR/$LIMITRATEVAR/g" ~/current/nginx.conf
echo "nginx.conf updated. Original stored in nginx.conf.original"
ここでの解決策は一部で機能しますが、DotCloud での実装に問題があるとは限りませんが、まだ試していない場合は試してみる価値があります。
構成の最上位レベル:
env MYVAR;
http レベル:
perl_set $myvar 'sub { return $ENV{"MYVAR"}; }';
次に、たとえばサーバー レベルで次のようにします。
root $myvar;