公開したバージョンを動かす

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 を渡してください。見つからなければ 400 no 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 で宣言してください。

すべてのツールとトピックはツールリファレンスに並んでいます。