公開したバージョンを動かす
version で宣言したサービスは、公開したイメージをビルドなしでその名前で動かします。ボックスによる pull と起動、env の追加変数、進み具合の確かめ方と切り替え方。
version 付きで宣言したサービスは、公開したイメージをその名前で動かします。ビルドも自分での docker run も不要です:
sandbox_start { "name": "返金改修の billing を使う web", "goal": "公開された返金版の billing を使って web フロントエンドを動かす。ブラウザで行った返金がその billing に記録されれば完了", "environment": "dev", "services": [{ "name": "billing.acme.internal", "port": 8080, "version": "refund-a1b2c3d" }] }
sandbox_wire { "id": "<id>", "service": "billing.acme.internal", "port": 8080, "version": "refund-a1b2c3d" }
versionはsandbox_versionsが返すラベルかversionIdです。同じラベルが複数のサービスで公開されている場合は、サービス名がこの名前か、その最初の DNS ラベル(billing.acme.internalならbilling)と一致するものが選ばれます。決まらなければ 400 でservice/label → versionIdの一覧が返るので、versionIdを渡してください。見つからなければ 400no published version with label or id "…"; sandbox_versions lists themです。- コントロールはボックスの起動時にバージョンを解決し、
targetPortを選びます。基本はportそのもので、80 か 9095 のとき、またはボックスの別のサービスが使っているときは、20000 から上で最初に空いているポートです。targetPortを自分で渡してもかまいません。sandbox_startはすぐに返り、コンテナが動けばボックスのプログラムからもコンテナからもname:portで届きます。 - ボックスの準備ができると、1 つのバックグラウンドコマンド(note は
start published <サービス>@<ラベル>)がdocker pullのあとdocker run -d --restart unless-stopped --name psbx-svc-<名前> -p <targetPort>:<コンテナのポート> [--env-file /work/.sbx/env/<サービス>.env] [-e NAME=value …] -e SBX_BOX_ID <image>を実行し、コンテナが待ち受けるまで最大 120 秒待ちます。<サービス>はそのバージョンを公開したときのサービスで、ボックスの環境にその設定ファイルがあれば渡されます。env(次の項目)のほかには何も渡されません。ボックスにexternalBaseUrlがあれば、先にその名前をboxに切り替えます。 env(versionと一緒にだけ使えます)は、コンテナに渡す追加の環境変数で、文字列から文字列へのマップです。たとえば{ "SENTRY_ENVIRONMENT": "psbx", "WORKERS_ENABLED": "false" }。設定ファイルのあとに渡されるので、同じ名前があればenvの値になり、引用符や$(…)も含めてそのまま渡されます。名前はシェル変数の規則に従い(英字、数字、_で、数字で始まらない)、SBX_BOX_IDは設定できず、最大 64 個、値は 1 つ 4 KB、合計 32 KB までです。値はsandbox_statusに出るので、秘密は入れないでください。バージョンをもう一度 wire すると、envはそのとき渡したもので丸ごと置き換わります。versionなしでenvを渡すと失敗します。sandbox_startではservices[<i>] (<name>): env goes with version, the published version to run; for your own process pass -e to docker run(400)、sandbox_wireでは先頭のservices[<i>] (<name>):がない同じ文です。- コンテナのポートは、
containerPortを渡せばそれ、なければイメージが EXPOSE している唯一の TCP ポート、それもなければportです。複数の TCP ポートを EXPOSE しているイメージにはcontainerPortが必要で、ないと起動はthe image exposes several TCP ports (…); declare the service with containerPortで失敗します。 - 結果は
sandbox_status→services[].runで見ます:state(not_started、starting、running、exited、failed、ボックスに問い合わせられないときはunknown)、image、versionId、label、container、logPath(起動コマンドのログ)、error(失敗したときはそのログの最後の数行付き)。メッセージにはdocker pull failed for <image>(レジストリにイメージがない:pull はnot foundと言います)、the container exited before it listened on port N (restarts: M)、the container did not start listening on port N within 120 sがあり、そのあとにコンテナの最後のログが続きます。 - 起動は 1 つのボックスにつき 1 回です。boxd が再起動してもコンテナは動き続け、コンテナが終了すれば Docker が起動し直します(
--restart unless-stopped)。 - バージョンを動かしている名前を別のバージョンに切り替えるには、同じ
serviceとportに新しいversionを付けてsandbox_wireを呼びます。sandbox_startでversion付きで宣言した名前でも、環境のアドレスでも使えます。コンテナpsbx-svc-<名前>は置き換わり、runはstartingからやり直し、名前のtargetPortは変わりません。試したボックスでは、コンテナが落ちるバージョンに切り替えるとrun.stateはfailedになり、元に戻すとrunningに戻りました。 - 規則:1 つのサービスがリンクとバージョンを兼ねることはできません(400
a link cannot also run a published version; use either fromBox or version)。containerPortはversionと一緒に使います。動いているボックスでversionを渡すにはportが必要です。take-over機能のないボックスでは、リンクになっている名前でバージョンは動かせません(409)。あなたが送ったimageとrunは無視されます。 - どのボックスもアカウントのレジストリにログイン済みです。10 時間以上凍結していたボックスは復帰時にログインし直すので、長く凍結した後も pull できます。
take-over機能のあるボックスでは、version付きのsandbox_wireは、起動時に宣言していない環境のアドレスやリンクも引き取ります(リンクや環境のアドレスを引き取る)。古いボックスでは引き取れません。バージョンは起動してrun.stateもrunningになりますが、名前はコネクタに向いたままで、コンテナは127.0.0.1:<targetPort>でしか応答しません。そのボックスでは、そうした名前はsandbox_startで宣言してください。
すべてのツールとトピックはツールリファレンスに並んでいます。