Skip to content

Japanese source

The original specification and guide are authored in Japanese. The Japanese route contains the same source text; this English route is a reading aid, not a separate translation or an implementation-availability claim.

Version-fixed Form specification

This version-fixed URL serves the Japanese normative source. Read the exact source. Publication does not imply Host or provider support.

Container 0.1.0 ​

Containerは一つのlogical private HTTPサービスを管理する。このResourceのUIDは実行process、 Docker container ID、Cloudflare Durable Object IDではない。旧未公開ContainerServiceの image・health・更新・復旧をHost API v2へ引き継いだ新しい契約であり、旧FormRefやstateと 自動変換しない。以下のInterface container.http とBinding module-worker.container を同じ版固定本文で定義する。これらの名前はこの未公開案での選択である。

入力 ​

specは次のキーだけを持つオブジェクト。未知キー、null、型変換、JSON重複キーを拒否する。 長さはUnicodeスカラー値で数え、不正なUnicode文字列も拒否する。

フィールド必須・既定意味と上限
image必須明示registry/repositoryに@sha256:と64桁の小文字hexを付けたOCI image参照。最大512文字。scheme、userinfo、query、fragment、tagのみの参照を拒否。任意tagはdigestより前だけに置ける。
httpPort必須image内のHTTP listener。整数1〜65535。public portの割当ではない。
healthPath必須GET readiness probeのabsolute path、1〜2048文字。/または空でないsegment列。query/fragment/backslash/control/空segmentを拒否。percent escapeは正しいUTF-8で、一度decodeしたsegmentに/、backslash、control、.、..を含めない。
workloadRevision必須利用者が宣言する実行構成のrevision。^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$。Host UID/generationの代わりにはならない。
environment任意、{}非秘密string map、最大64キー。名前は^[A-Za-z_][A-Za-z0-9_]{0,63}$。各値は4096文字以下、NULなし。CLOUDFLARE_、TAKOFORM_で始まる名前は予約し、全backendで拒否する。
requiredSensitiveVars任意、[]名前だけの宣言欄。名前文法は^[A-Z][A-Z0-9_]{0,63}$、重複・environmentとの衝突を許さない。この初期版は秘密注入を提供せず、非空配列を拒否する。値をこの欄へ置けない。
outboundInternet任意、falsetrueを明示した場合だけ実行processの外向きInternet通信を許可する。課金・容量・全宛先への到達性は保証しない。

imageのregistryは小文字のDNS名(各labelは英数字で始まり終わり内部hyphen可)または localhost、任意のportは1〜65535。repositoryは小文字英数字で始まる空でないsegment列で、 各segmentは[a-z0-9]+(?:[._-][a-z0-9]+)*。tagは[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}。 healthPathのraw segmentは[A-Za-z0-9._~!$&'()*+,;=:@-]または%HHの列である。 ここでcontrolはU+0000〜001FとU+007F。非ASCII文字はUTF-8をpercent-encodeする。 image digestは単一のlinux/amd64 OCI manifestを識別する。multi-platform indexのdigest、 違うplatform、取得bytesがdigestと異なるimageを拒否する。registry認可・manifest/layer検証・ retentionはHostの責任で、URLやdigestを知るだけでは取得権限を得ない。

json
{
  "image": "ghcr.io/example/app@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "httpPort": 8080,
  "healthPath": "/health",
  "workloadRevision": "revision-1",
  "environment": { "APP_MODE": "production" },
  "outboundInternet": false,
  "requiredSensitiveVars": []
}

例は説明用であり、imageの存在やHostのsupportを示さない。privateInputsは省略または 空objectだけを許す。environmentは公開specとして保存・readbackされるので秘密を置かない。 値から秘密を自動検出する契約はない。秘密注入・rotationは後続のForm URLで定義する。

同一spec比較では任意の既定値を展開し、objectのキー順を無視する。stringはUnicode正規化せず 同じスカラー列で比較する。workloadRevisionも比較対象で、同じrevision文字列でも他の 設定が変われば変更である。Formの既定値展開は共通APIのreplay fingerprintとは別である。 original requestの省略・明示の違いを勝手に同一再送として扱わない。

Interface: container.http ​

一つの選択済みserving executionへprivate HTTP要求を送るInterfaceである。callerは instanceやnative URLを選ばない。Hostは新規callのroute選択を切替と直列化し、call開始時に 一つのhealthy serving generationへ固定する。同じUIDでもapplication dataの整合性や request間のprocess affinityは保証しない。runtime filesystem、memory、process identityは ephemeralで、再作成やscale-to-zeroをまたぐ永続性はない。永続dataは別サービスが所有する。

実行はimageのENTRYPOINT/CMDを使う。任意exec、shell、start/stop、port選択、native DO storageへの操作はこのInterfaceに含めない。scale-to-zero後のcallは同じ保持済み構成を起動し、 health確認後に配送する。準備できなければbackend_unavailableであり、別imageへfallbackしない。

Worker Binding: module-worker.container ​

WorkerVersion 0.6.0の containerBindings:[{"name":string,"resource":{"resourceUid":string}}]に宣言する。 省略は[]、最大64件。名前はJavaScript identifier文法 ^[A-Za-z_$][A-Za-z0-9_$]{0,63}$、vars・秘密名・他Bindingを含むenv全体で重複禁止。 resource参照は非空UID stringだけを持つ閉じたobject。同じHost・Space、正確なこのForm URL、 callerの参照利用権限を副作用前に確認する。名前や最新URLで再解決せず、削除・再作成後の 別UIDへ付け替えない。WorkerVersion UIDとtarget UIDへscopeした能力であり、UIDそのものは 認可を与えない。実行中の認可取消は新規callを拒否し、既存callもHostが取消して隔離する。

アプリの唯一のメソッドはenv.APP.fetch(request: Request): Promise<Response>。

javascript
export default {
  async fetch(request, env) {
    return env.APP.fetch(request);
  }
};

このBindingへ渡すRequestはHTTP(S) URL、methodはGET/HEAD/POST/PUT/PATCH/DELETE/OPTIONS。 URLのauthorityは配送先を選ばない。URLのpathnameとqueryをそのまま対象httpPortへ渡す。 userinfo、fragment、backslash、path/query内のcontrol、8192文字を超えるpath+queryを拒否。 WebSocket/HTTP upgradeは提供せず、Upgrade要求はinvalid_requestで拒否する。 GET/HEADの要求bodyはない。入力は未消費のRequestだけで、取消済みsignalは配送前に拒否する。 callerがResponseから新しい要求を作る判断と、Hostのtransparent retryは別である。

Streaming、headers、error ​

  • Request/Response bodyは双方stream、backpressureを伝え、全量を先読みしない。Promiseは 最終response headを受けた時点でresolveし、applicationの4xx/5xxも通常Responseとして返す。 3xxもそのまま返し、Locationへ追従しない。101やupgrade、malformed headはhead前の失敗。
  • 各方向のbody上限は104857600 bytes。既知の過大requestは配送前、既知の過大responseは head公開前に拒否。未知長のoverflowは部分配送後でもstreamをabortし、再送を許可しない。
  • 各方向headerはFetch Headersで正規化したentryが最大64、各name/valueのsingle-byte長と : 、CRLFの4 bytesの和が最大16384 bytes。ASCII tokenのname、HTABとU+0020〜007E/ U+0080〜00FFのvalueだけを許す。CR/LF/NULを拒否。Set-CookieはgetSetCookie()で別entryを 保持する。他のduplicate fieldのcasing/order/raw wire表現はFetchのnormalizationに従う。
  • 上限はtransport header除去前に検査する。Host、Connection、Keep-Alive、Proxy-Authenticate、 Proxy-Authorization、TE、Trailer、Transfer-Encoding、UpgradeとConnectionが指名する headerを除去し、native宛先用HostはHostが作る。application Authorizationは保持する。 ConnectionがContent-Lengthを指名する要求はinvalid_requestとする。
  • Content-Lengthはapplication headerとして転送せず、単一のcanonical非負10進integerを safe integer範囲で検証してtransport framingに使う。duplicate/comma/不正値/矛盾を拒否する。 宣言bytesと実際のcountが異なればabortする。未知長を調べるためにbufferしない。 native responseの不正framingはhead前のbackend_unavailableである。
  • response statusは200〜599。HEAD/204/205/304はbodyなしで、これらのContent-Lengthは representation lengthを示し得るためpayload countと比較せずcallerへ投影しない。 他のresponseには0 bytesでもstreamがあり、既知長0と未知長を混同しない。
  • caller signalのabortはuploadとbackend I/Oを取消する。Response bodyのcancelもbackend streamを取消する。backendが早期responseを返した場合は未完uploadを取消し、配送済みstatusを 置き換えない。request失敗/取消時はまだ開いているresponse bodyもerrorにする。
  • 配送が不明なapplication要求をいかなるmethodでも別executionへ自動retryしない。 response head後のreset/overflow/count mismatchは公開したbodyのerrorであり、HTTP statusの 置換や成功した空Responseにしない。管理Operationの再送規則をapplication I/Oへ流用しない。

reject/body errorはError.name:"ContainerError"、codeは以下の閉じた語彙。messageとcodeへ 入力値、native診断、credentialを含めない。head後は既に渡したPromiseをrejectできないので bodyのreadが同じErrorで失敗する。

code条件
invalid_request入力形、method/URL/header/framing/upgrade違反。head前。
backend_unavailable認可取消、healthy routeなし、起動不能、接続/head不正。head前。
request_abortedcaller取消、upload count不一致、要求stream失敗。head前はreject、head後は残存body error。
request_too_largerequest bytes上限超過。同じ前後のerror境界。
response_abortedhead後の接続reset、response count不一致、response stream失敗、drainでの取消。
response_too_largeresponse上限超過。既知長はhead前reject、未知長はhead後body error。

観測とoutput ​

observedは未観測なら{}。観測後はready:booleanが必須、serving executionが確立した後だけ servingGeneration(v2共通generationと同じ1〜9007199254740991の整数)とimageDigest (sha256:+64小文字hex)を両方持つ。初回失敗時は{ready:false}。他のキーは禁止。 ready:trueはその観測で選択先のhealth GETが2xxで、配送経路が確認できた意味。 未知/timeoutはfalseまたは最後の時点付き観測で示し、freshなtrueとしない。cold idleでは 保持構成があっても、起動後のhealthを確認するまでready:falseを記録する。

更新失敗時に古いexecutionがhealthyならready:true/古いservingGenerationを保持できる。 common observedGenerationは新desired generationを実現するまでadvanceしない。 observedAtは実際の確認時点で、GET時刻ではない。outputは常に{}。native IP/port/ID、 credential、秘密、公開URLを返さない。management phase:idleやOperation成功はSLAではない。

CRUD、切替、復旧、所有 ​

共通Resource/Operation/replay/error の全create/read/update/deleteが必須。Offeringを持つHostは選択とrevisionを明示的に確認し、 capacity/placement/native instance size/料金をそこで定義する。Form URL/Space/name/Offering/UIDを 普通のPUTで移行しない。

CREATEはexact image/構成を取得・検証・保持し、owned executionを起動、httpPortのhealthPathへ GETし、2xxを確認してからservingへ選ぶ。probeはredirectを追わず、そのbodyは破棄する。 portがlistenするだけ、native start/runningだけをhealth成功としない。 起動・probeの期限とcapacityはHostがOffering等で公開し、期限切れから効果なしと推定しない。

GETは同UIDの管理記録・spec・最後の観測を返し、実行process消失を404に置換しない。 GETから新しいOperationを作らない。background recoveryは元の所有記録を使う。

PUTは全specを置換する。全設定を変更でき、workloadRevisionだけの変更も新構成。 新Idempotency-Keyの同一spec PUTも新Operation/generationを作り再照合する。 旧executionを壊す前に新構成のhealthを確認し、routeを一度に切り替える。health失敗なら 旧servingを保ち、失敗したdesired generationを実現済みにしない。new callsは切替後のexecution、 既存callは選択済みexecutionへ固定する。切替から30000ms以内に旧callを完了または取消し、 残存I/Oとowned processの物理退役を確認する。部分的なrouteや別imageへのfallbackを公開しない。

DELETEは生きたWorkerVersionのcontainerBindings(未選択Version、pending作成も含む)が このUIDを参照する間、外部効果前に409 dependency_conflictで拒否する。参照消失後は 新規配送を閉じ、既存I/Oを取消して30秒以内の退役を進め、owned executions、private route、 Host保持imageのこのResource分の参照を除く。共有imageを他Resourceの参照中に消さない。 独立したdata/Worker/Binding元を連鎖削除しない。退役・所有物cleanupの確認前に成功にしない。

Hostは副作用前にUID、Operation、generation、workloadRevision、exact imageとbackend所有記録を 永続化する。lost ACK/process restart/timeout後はその記録と実行先を照合し、不明なら effect:unknown/status:reconcilingの非terminal Operationを保つ。別名/別UIDへ作り直して 不明な効果を隠さない。partial stateは同UIDの記録に残し、terminal失敗後の明示PUT/DELETEで forward repairする。known absentを確認したowned executionの削除は成功し得るが、timeoutは absenceの証拠ではない。管理復旧はapplication要求の再実行を許可しない。

拒否は共通APIのinvalid_spec/dependency_conflict等を使う。受理後のForm error.codeは image_unavailable、image_invalid、startup_failed、health_failed、cleanup_failedだけ。 未知効果をfailedにせずreconcilingへ保持する。diagnosticsはpayload-freeで、raw native responseを 公開しない。実行dataのreverse migrationはなく、失敗更新は旧serving保持または新PUTで修復する。

backend対応と適合 ​

hostedはCloudflare ContainersをHost所有DO executor/broker経由で実行する。self-host Dockerと Linux/systemd上のDocker Engineも、同じlinux/amd64 image、spec、UID、Bindingを使う。 裸のhost processをOCI imageとして扱わない。daemon-free OCI runtimeは別backend実装。 どのbackendもtenant隔離、owned network/process、false時のInternet拒否、同じhealth/cutover/ stream/cancel/authority semanticsを満たす。true時にもnative管理planeと他tenantへ無条件の アクセスを許さず、Hostの認可・network policyを維持する。

Cloudflareのdurable_object policyのnamed image catalogは1 applicationあたり100 entriesまで。 これはこのFormのResource数やDocker/Linuxの共通上限ではない。HostがOffering/capacity admissionで staging、current/old serving、drain/recoveryのimage slotsを公開・予約し、満杯なら効果前に 拒否する。registryへ事前copyしても元のmanifest/layerのdigestを検証し保持する。image map更新 だけで稼働instanceが新imageへ切り替わったと判断しない。native scheduling policy、DO namespace、 account credentialをアプリへ渡さない。

上記Cloudflare制約の参考はScheduling policies、 linux/amd64、 Container API。 この本文が共通仕様の正本で、native製品の追加機能はportable caller APIを拡張しない。

適合はspec形だけでなく、healthy create、failed updateでの旧serving保持、healthy cutover、 30秒drain、lost ACKと実Host process再起動、same UID repair、bound deletion拒否、tenant認可、 stream/backpressure/cancel、head前後error、framing、無retry、false/true egressを実backendで 測る。ローカルfixtureやsource公開だけをCloudflare/Docker/Linuxのsupport証拠にしない。 現Takoserver候補はsecret/true egress/Worker bindingが未対応であり、このURLのHost supportを 今回のpublisher変更から宣言しない。