Dockerは自社のcnab-to-ociライブラリを、Cloud Native Application Bundle(CNAB)プロジェクトに寄贈すると発表した。このライブラリでは、CNABアプリケーションバンドルを変換した上で、既存のOCI抽象化を使用してOCI準拠のレジストリにプッシュすることが可能である。
CNAB仕様 — Docker、Microsoft、HashCorp、Bitnami、Codefreshなどがオリジナルを共同開発した — は、分散アプリケーションのパッケージ化と実行のためのクラウド非依存型ソリューションを目指す試みのひとつである。DockerCon Europe 2018で発表されたCNABでは、複数のコンポーネントで構築されるアプリケーションを説明する上で、"バンドル"という概念を用いている。HelmチャートやKubernetesのマニフェストやテンプレート/リソースの記述、Dockerfileなどをバンドルとして利用することも可能だ。cnab-to-ociツールは、これらのバンドルをOCI準拠ないしDockerレジストリを使用して共有するためのリファレンス実装である。このツールでは、OCIイメージ仕様のOCIインデックス — ストアされているメディアの種類を公開する — を使用して、CNABのバンドルメタデータとレジストリ内のイメージへのリファレンスを保持する。
CNABバンドルはディスクリプタ(bundle.json)、呼び出し(invocation)イメージ、バンドルリポジトリのリストで構成される。bundle.jsonは、バージョニング情報と設定可能なパラメータを含むメタデータである。アプリケーションをインストールするために必要なワークフローである実際のロジック — インストーラ — は、呼び出しイメージの中にある。この中には、HelmチャートやK8Sマニフェストなど、さまざまなツールの宣言型コンフィギュレーションを含むことが可能で、バンドルのライフサイクル — インストール、アップグレード、アンインストール — の管理に使用される。バンドルリポジトリ(bundle repositories)のセクションは、指定されたイメージの保管先や取得先に関する情報である。
Open Container Initiative(OCI)イメージ仕様には"OCIイメージインデックス"がある。これは通常、プラットフォームでサポートされているマニフェスト(あるいはコンテナイメージ)の一覧をフェッチするために、クライアントによって使用される。一方でこの情報は、その他のメディアを保管するために使用することも可能であるため、cnab-to-ociツールではこれを使ってバンドルや呼び出しイメージ、バンドルが参照するコンポーネントイメージの保管を行う。メディアタイプの受け渡しには、現在はインデックス内のOCIアノテーション — オプション機能 — を使用しているが、OCIに"mediaType"フィールドを追加する提案がされているので、このアノテーションの使用は将来的に廃止されるものと思われる。
cnab-to-ociツールの大きな目標は、bundle.jsonファイルをレジストリに格納可能なフォーマットにパッケージすることだが、バンドル内のすべての関連イメージを同じレジストリに置くことや、レジストリ間でアトミックに移動可能にすることなどの試みも行われている。これが実現すれば、エンドユーザに対して一貫性のあるバンドルのビューを提供できるようになるはずだ。
cnab-to-ociはDocker APP(CNABを実装している)やPorter、duffle(CNABのリファレンス実装)などで使用されている。CNABバンドルを配布する推奨方法は — 設計上 — 存在しないが、CNABレジストリ仕様には、このような配布に使用可能なOCIレジストリを標準化する方法が提案されている。