(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-12-02
(45)【発行日】2024-12-10
(54)【発明の名称】実行時コンテナ
(51)【国際特許分類】
G06F 9/4401 20180101AFI20241203BHJP
【FI】
G06F9/4401
【外国語出願】
(21)【出願番号】P 2023111341
(22)【出願日】2023-07-06
(62)【分割の表示】P 2022526203の分割
【原出願日】2020-11-06
【審査請求日】2023-07-28
(32)【優先日】2019-11-08
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】502208397
【氏名又は名称】グーグル エルエルシー
【氏名又は名称原語表記】Google LLC
【住所又は居所原語表記】1600 Amphitheatre Parkway 94043 Mountain View, CA U.S.A.
(74)【代理人】
【識別番号】110001195
【氏名又は名称】弁理士法人深見特許事務所
(72)【発明者】
【氏名】クレーマー,ドミニク
(72)【発明者】
【氏名】デイ,ライアン
【審査官】山本 俊介
(56)【参考文献】
【文献】米国特許第08219987(US,B1)
【文献】特開2008-209982(JP,A)
【文献】特開2004-078751(JP,A)
【文献】米国特許第09823915(US,B1)
【文献】国際公開第2019/181860(WO,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/44-9/455
(57)【特許請求の範囲】
【請求項1】
データ処理ハードウェア上で実行されると、前記データ処理ハードウェアに動作を実行させる、コンピュータにより実現される方法であって、前記動作は、
開発者デバイスから、前記開発者デバイスにおいてローカルに開発されたソフトウェアアプリケーションのための実行環境を構築するための要求を受信することを含み、前記ソフトウェアアプリケーションは、依存関係のマニフェストを含み、前記要求は、データストアにおける前記ソフトウェアアプリケーションの記憶場所を識別する識別子を含み、前記動作はさらに、
前記識別子を使用して前記データストアから前記ソフトウェアアプリケーションを取得することと、
前記データストアにおいて前記ソフトウェアアプリケーションのための関連付けられた実行環境が存在しないと判断することと、
前記データストアにおいて前記ソフトウェアアプリケーションのための関連付けられた実行環境が存在しないという判断に基づいて、
前記依存関係のマニフェストを使用して前記ソフトウェアアプリケーションのための
ブートストラップ実行環境を構成することと、
前記ブートストラップ実行環境における前記ソフトウェアアプリケーションを実行して、アプリケーション依存関係のセットを含む拡張された実行環境を生成することと、
前記データストアに前記
拡張された実行環境を記憶することと、
前記
拡張された実行環境
において前記ソフトウェアアプリケーションを実行することとを含む、コンピュータにより実現される方法。
【請求項2】
前記ソフトウェアアプリケーションのための前記
ブートストラップ実行環境を構成することは、構成ファイルを使用することなく行われる、請求項1に記載のコンピュータにより実現される方法。
【請求項3】
前記構成ファイルは、ドッカーファイルを含む、請求項2に記載のコンピュータにより実現される方法。
【請求項4】
前記ソフトウェアアプリケーションは、Rubyアプリケーションを含む、請求項1~3のいずれか1項に記載のコンピュータにより実現される方法。
【請求項5】
前記ソフトウェアアプリケーションは、Node.jsアプリケーションを含む、請求項1~3のいずれか1項に記載のコンピュータにより実現される方法。
【請求項6】
前記ソフトウェアアプリケーションは、Pythonアプリケーションを含む、請求項1~3のいずれか1項に記載のコンピュータにより実現される方法。
【請求項7】
前記識別子を使用して前記データストアから前記ソフトウェアアプリケーションを取得することは、
前記開発者デバイスが前記データストアから前記ソフトウェアアプリケーションにアクセスすることを許可されていると判断することと、
前記開発者デバイスが前記データストアから前記ソフトウェアアプリケーションにアクセスすることを許可されていると判断することに基づいて、前記データストアから前記ソフトウェアアプリケーションを取得することとを含む、請求項1~6のいずれか1項に記載のコンピュータにより実現される方法。
【請求項8】
前記依存関係のマニフェストは、前記ソフトウェアアプリケーションのための1つ以上のソフトウェアライブラリを含む、請求項1~7のいずれか1項に記載のコンピュータにより実現される方法。
【請求項9】
前記
拡張された実行環境
において前記ソフトウェアアプリケーションを実行することは、遠隔システムにおいて前記
ソフトウェアアプリケーションを実行することを含む、請求項1~8のいずれか1項に記載のコンピュータにより実現される方法。
【請求項10】
前記データストアは、コンテナレジストリを含む、請求項1~9のいずれか1項に記載のコンピュータにより実現される方法。
【請求項11】
システムであって、
データ処理ハードウェアと、
前記データ処理ハードウェアと通信するメモリハードウェアとを備え、前記メモリハードウェアは、前記データ処理ハードウェアによって実行されると前記データ処理ハードウェアに動作を実行させる命令を格納し、前記動作は、
開発者デバイスから、前記開発者デバイスにおいてローカルに開発されたソフトウェアアプリケーションのための実行環境を構築するための要求を受信することを含み、前記ソフトウェアアプリケーションは、依存関係のマニフェストを含み、前記要求は、データストアにおける前記ソフトウェアアプリケーションの記憶場所を識別する識別子を含み、前記動作はさらに、
前記識別子を使用して前記データストアから前記ソフトウェアアプリケーションを取得することと、
前記データストアにおいて前記ソフトウェアアプリケーションのための関連付けられた実行環境が存在しないと判断することと、
前記データストアにおいて前記ソフトウェアアプリケーションのための関連付けられた実行環境が存在しないという判断に基づいて、
前記依存関係のマニフェストを使用して前記ソフトウェアアプリケーションのための
ブートストラップ実行環境を構成することと、
前記ブートストラップ実行環境における前記ソフトウェアアプリケーションを実行して、アプリケーション依存関係のセットを含む拡張された実行環境を生成することと、
前記データストアに前記
拡張された実行環境を記憶することと、
前記
拡張された実行環境
において前記ソフトウェアアプリケーションを実行することとを含む、システム。
【請求項12】
前記ソフトウェアアプリケーションのための前記
ブートストラップ実行環境を構成することは、構成ファイルを使用することなく行われる、請求項11に記載のシステム。
【請求項13】
前記構成ファイルは、ドッカーファイルを含む、請求項12に記載のシステム。
【請求項14】
前記ソフトウェアアプリケーションは、Rubyアプリケーションを含む、請求項11~13のいずれか1項に記載のシステム。
【請求項15】
前記ソフトウェアアプリケーションは、Node.jsアプリケーションを含む、請求項11~13のいずれか1項に記載のシステム。
【請求項16】
前記ソフトウェアアプリケーションは、Pythonアプリケーションを含む、請求項11~13のいずれか1項に記載のシステム。
【請求項17】
前記識別子を使用して前記データストアから前記ソフトウェアアプリケーションを取得することは、
前記開発者デバイスが前記データストアから前記ソフトウェアアプリケーションにアクセスすることを許可されていると判断することと、
前記開発者デバイスが前記データストアから前記ソフトウェアアプリケーションにアクセスすることを許可されていると判断することに基づいて、前記データストアから前記ソフトウェアアプリケーションを取得することとを含む、請求項11~16のいずれか1項に記載のシステム。
【請求項18】
前記依存関係のマニフェストは、前記ソフトウェアアプリケーションのための1つ以上のソフトウェアライブラリを含む、請求項11~17のいずれか1項に記載のシステム。
【請求項19】
前記
拡張された実行環境
において前記ソフトウェアアプリケーションを実行することは、遠隔システムにおいて前記
ソフトウェアアプリケーションを実行することを含む、請求項11~18のいずれか1項に記載のシステム。
【請求項20】
前記データストアは、コンテナレジストリを含む、請求項11~19のいずれか1項に記載のシステム。
【請求項21】
前記データ処理ハードウェアに請求項1~10のいずれか1項に記載の方法を実行させる、プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
技術分野
本開示は、ソフトウェアアプリケーションのための実行環境を効率的に構成および展開することに関する。
【背景技術】
【0002】
背景
コンテナ技術は、従来の仮想化環境に関連付けられる大きなオーバーヘッドを招くことなく、アプリケーションおよびサービスを迅速にスケーリングする見込みを提供する。ソフトウェアアプリケーションのためのソースコードは、コンテナ内での動作展開に先立って、ソフトウェア開発環境内で開発および試験されてもよい。コンテナビルダは、入力されるソースコードから出力されるコンテナを構築するために公然利用可能である。これらのコンテナビルダは、概して、ソースコードを展開のために対応するコンテナにどのようにパッケージ化するかを記述する命令および構築ツールを含む。コンテナビルダは、しばしば、ソフトウェア開発キット、コンパイラ、および/またはデバッガなどの構築時ツール、ならびに出力されるコンテナを実行するためのランタイム環境の両方を含む、重いコンテナイメージを生成する。これらの重いコンテナイメージはより大きく、展開および顧客への配信時に不要なコンテンツ/コンポーネントを含む。例えば、展開されたコンテナにコンパイラを含めることは、コンテナに重量を追加するだけでなく、パッケージ化された展開に攻撃ベクトルおよびセキュリティ脆弱性を導入するので、不必要である。より軽量な実行環境は、アプリケーションまたはサービスをサポートするために必要なコンポーネント/コンテンツのみを含む。しかしながら、実行環境のこの合理化は、構成負担の増加という犠牲を払って成り得る。ソフトウェア開発プラットフォームは、アプリケーション実行環境を構成および展開することに対しては最適化されていない場合がある。さらに、ソフトウェア開発者は、軽量実行環境を構成および展開するのに熟練もしくは知識がないことがあり、または実行環境を構成もしくは展開する権限がないことがある。その結果、軽量実行環境においてアプリケーションを展開することを望むソフトウェア開発者は、非効率に直面する。
【発明の概要】
【課題を解決するための手段】
【0003】
概要
本開示の態様は、ソフトウェアアプリケーションのための実行環境を構成および展開することに関する。一態様は、データ処理ハードウェアにおいて、データストアからブートストラップ実行環境を受信することを含む方法を提供し、ブートストラップ実行環境は、依存関係のマニフェストを有するソフトウェアアプリケーションを含む。本方法は、データ処理ハードウェアがブートストラップ実行環境を実行し、拡張された実行環境がデータストアから利用可能であるかどうかを判断することを含む動作をデータ処理ハードウェアに実行させることをさらに含む。拡張された実行環境がデータストアから利用可能である場合、動作は、データストアから拡張された実行環境を受信することと、拡張された実行環境に基づいてブートストラップ実行環境を拡張することと、ソフトウェアアプリケーションを実行することとをさらに含む。拡張された実行環境がデータストアから利用可能ではない場合、動作は、依存関係のマニフェストに基づいてブートストラップ実行環境を拡張して、拡張された実行環境を作成することと、拡張された実行環境をデータストアに記憶することと、ソフトウェアアプリケーションを実行することとを含む。
【0004】
本開示の実現例は、以下の任意選択の特徴のうちの1つ以上を含んでもよい。いくつか
の実現例では、本方法は、データ処理ハードウェアが、データストア内の拡張された実行環境に注釈を付けて、ソフトウェアアプリケーションのバージョン、拡張された実行環境に関連付けられるオペレーティングシステムバージョン、または拡張された実行環境に関連付けられるプロセッサアーキテクチャのうちの少なくとも1つを示すことを含む。拡張された実行環境がデータストアから利用可能であるかどうかを判断することは、拡張された実行環境が、ソフトウェアアプリケーション、ブートストラップ実行環境に関連付けられるオペレーティングシステムバージョン、またはブートストラップ実行環境に関連付けられるプロセッサアーキテクチャのうちの少なくとも1つと互換性があるかどうかを判断することを含んでもよい。
【0005】
本方法は、データ処理ハードウェアにおいて、ソフトウェアアプリケーションのための構築要求を受信することと、データ処理ハードウェアが、ソフトウェアアプリケーションに基づいてブートストラップ実行環境を構成することと、データ処理ハードウェアが、ブートストラップ実行環境をデータストアに記憶することとをさらに含んでもよい。依存関係のマニフェストに基づいてブートストラップ実行環境を拡張することは、アプリケーション依存関係をインストールすることを含んでもよい。いくつかの例では、ソフトウェアアプリケーションは、JavaScriptアプリケーション、Pythonアプリケーション、またはRubyアプリケーションのうちの1つである。アプリケーション依存関係は、サポートライブラリ、アーキテクチャ固有のバイナリモジュール、または実行時にコンパイルされるモジュールのうちの少なくとも1つを含んでもよい。いくつかの実現例では、本方法は、依存関係のマニフェストに基づいてブートストラップ実行環境を拡張して、拡張された実行環境を作成した後、依存関係のマニフェストに基づいてブートストラップ実行環境を拡張することによって追加または修正されたファイルを含む更新されたファイルのセットを識別することを含む。拡張された実行環境をデータストアに記憶することは、更新されたファイルのセットをデータストアに記憶することを含んでもよい。いくつかの例では、ブートストラップ実行環境はコンテナイメージを含み、データストアはコンテナレジストリを含む。
【0006】
本開示の別の態様は、ソフトウェアアプリケーションのための実行環境を構成し、展開するためのシステムを提供する。本システムは、データ処理ハードウェアと、データ処理ハードウェアと通信するメモリハードウェアとを備える。メモリハードウェアは、データ処理ハードウェア上で実行されるとデータ処理ハードウェアに動作を実行させる命令を記憶する。動作は、データストアからブートストラップ実行環境を受信することを含み、ブートストラップ実行環境は、依存関係のマニフェストを有するソフトウェアアプリケーションを含む。動作は、ブートストラップ実行環境を実行し、拡張された実行環境がデータストアから利用可能であるかどうかを判断することを含むさらなる動作をデータ処理ハードウェアに実行させることをさらに含む。拡張された実行環境がデータストアから利用可能である場合、動作は、データストアから拡張された実行環境を受信することと、拡張された実行環境に基づいてブートストラップ実行環境を拡張することと、ソフトウェアアプリケーションを実行することとをさらに含む。拡張された実行環境がデータストアから利用可能ではない場合、動作は、依存関係のマニフェストに基づいてブートストラップ実行環境を拡張して、拡張された実行環境を作成することと、拡張された実行環境をデータストアに記憶することと、ソフトウェアアプリケーションを実行することとを含む。
【0007】
本開示の実現例は、以下の任意選択の特徴のうちの1つ以上を含んでもよい。いくつかの実現例では、動作は、データストア内の拡張された実行環境に注釈を付けて、ソフトウェアアプリケーションのバージョン、拡張された実行環境に関連付けられるオペレーティングシステムバージョン、または拡張された実行環境に関連付けられるプロセッサアーキテクチャのうちの少なくとも1つを示すことをさらに含む。拡張された実行環境がデータストアから利用可能であるかどうかを判断することは、拡張された実行環境が、ソフトウ
ェアアプリケーション、ブートストラップ実行環境に関連付けられるオペレーティングシステムバージョン、またはブートストラップ実行環境に関連付けられるプロセッサアーキテクチャのうちの少なくとも1つと互換性があるかどうかを判断することを含んでもよい。
【0008】
動作は、ソフトウェアアプリケーションのための構築要求を受信することと、ソフトウェアアプリケーションに基づいてブートストラップ実行環境を構成することと、ブートストラップ実行環境をデータストアに記憶することとをさらに含んでもよい。依存関係のマニフェストに基づいてブートストラップ実行環境を拡張することは、アプリケーション依存関係をインストールすることを含んでもよい。いくつかの例では、ソフトウェアアプリケーションは、JavaScriptアプリケーション、Pythonアプリケーション、またはRubyアプリケーションのうちの1つである。アプリケーション依存関係は、サポートライブラリ、アーキテクチャ固有のバイナリモジュール、または実行時にコンパイルされるモジュールのうちの少なくとも1つを含んでもよい。いくつかの実現例では、動作は、依存関係のマニフェストに基づいてブートストラップ実行環境を拡張して、拡張された実行環境を作成した後、依存関係のマニフェストに基づいてブートストラップ実行環境を拡張することによって追加または修正されたファイルを含む更新されたファイルのセットを識別することを含む。拡張された実行環境をデータストアに記憶することは、更新されたファイルのセットをデータストアに記憶することを含んでもよい。いくつかの例では、ブートストラップ実行環境はコンテナイメージを含み、データストアはコンテナレジストリを含む。
【0009】
本開示の1つ以上の実現例の詳細を、添付の図面および以下の説明に記載する。他の態様、特徴、および利点は、説明および図面、ならびに特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【0010】
【
図1】アプリケーション実行環境を構成し展開するための例示的な環境の概略図である。
【
図2A】ソフトウェアアプリケーションおよび対応の依存関係のマニフェストの概略図である。
【
図2B】ソフトウェアアプリケーションおよび対応の依存関係のマニフェストの概略図である。
【
図2C】ソフトウェアアプリケーションおよび対応の依存関係のマニフェストの概略図である。
【
図3A】ソフトウェアアプリケーションを実行するための実行環境を構築する概略図である。
【
図3B】ソフトウェアアプリケーションを実行するための実行環境を構築する概略図である。
【
図3C】ソフトウェアアプリケーションを実行するための実行環境を構築する概略図である。
【
図3D】ソフトウェアアプリケーションを実行するための実行環境を構築する概略図である。
【
図3E】ソフトウェアアプリケーションを実行するための実行環境を構築する概略図である。
【
図4】ソフトウェアアプリケーションのための実行環境を構成および展開する方法のための動作の例示的な構成のフローチャートである。
【
図5】例示的なコンピューティングデバイスの概略図である。
【発明を実施するための形態】
【0011】
様々な図面における同様の参照符号は、同様の要素を示す。
詳細な説明
ソフトウェアアプリケーションは、ソフトウェア開発環境において開発された後に、アプリケーション実行環境において動作可能に展開される場合がある。コンテナは、ソフトウェアアプリケーションを展開するための好ましいアプリケーション実行環境として現れつつある。コンテナ技術は、従来の仮想化環境に関連付けられる大きなオーバーヘッドを招くことなく、アプリケーションおよびサービスを迅速にスケーリングする見込みを提供する。複数のコンテナ化されたアプリケーションは、単一のホストコンピュータ上で実行され、同じ基底のオペレーティングシステムにアクセスしてもよい。さらに、コンテナ化されたアプリケーションは、様々な基底のオペレーティングシステムおよび/またはコンピュータもしくはプロセッサアーキテクチャ上で実行されてもよい。コンテナビルダは、入力ソースコードからコンテナイメージを構築するために公然利用可能である。これらのコンテナビルダは、典型的には、ソフトウェア開発キット、コンパイラ、および/またはデバッガ等の構築時ツール、ならびにソフトウェアアプリケーションを実行するために必要とされる実行時環境を含む、重いコンテナイメージを生成する。これらの重いコンテナイメージは大きく、展開/配信されるときに不要なコンテンツ/コンポーネントを含むことが多い。例えば、展開されたコンテナにコンパイラを含めることは、コンテナに重量を追加し、パッケージ化された展開に攻撃ベクトルおよびセキュリティ脆弱性を導入するので、不必要である。コンテナイメージを構成および展開することは、時間、労力、および技術を必要とする。コンテナイメージは、ソフトウェアアプリケーションが更新されるたびに再構成される必要がある場合がある。頻繁な再構成は、ソフトウェア開発の費用および労力を増大させる。
【0012】
より軽量な実行環境は、例えばソフトウェア開発コンテンツ/コンポーネントなしで、アプリケーションまたはサービスをサポートするために必要なコンポーネント/コンテンツのみを含む。しかしながら、より軽量な実行環境を構成および展開するためには、特殊な技術または知識が必要とされ得る。構成は、省略されるべきソフトウェア開発コンテンツ/コンポーネントを識別すること、および実行環境に含まれるべき必要な実行時コンテンツ/コンポーネントを識別することを必要とし得る。要するに、アプリケーション実行環境は、ソフトウェア開発環境とは実質的に異なり得る。例えば、ソフトウェア開発環境は、ウェブブラウザ、電子メールクライアント、修正制御システム、および/またはソフトウェア開発を容易にするために最適化されたグラフィカルディスプレイを含み得る。しかしながら、アプリケーション実行環境は、展開されたアプリケーションの、信頼できる効率的な実行のために、最適化され得る。ソフトウェア開発者は、軽量実行環境を構成および展開するのに熟練もしくは知識がないことがあり、または実行環境を構成もしくは展開する権限がないことがある。
【0013】
コンテナビルダは、コンテナ構成最良実践の深い習熟を必要とすることなく汎用コンテナイメージを構築するために公然利用可能である。しかしながら、これらのコンテナビルダは、静的イメージからコンテナを構築する。すなわち、静的コンテナイメージは、アプリケーションの初期または「ブートストラップ」実行のための環境を含む。この手法は、アーキテクチャに依存しないソフトウェアアプリケーションまたはアーキテクチャついて互換性のあるソフトウェアアプリケーションに対しては充分であるかもしれないが、ソフトウェアアプリケーションは、それらの実行環境をカスタマイズまたは拡張した後、より効率的に実行される場合がある。例えば、ソフトウェアアプリケーションは、アーキテクチャ特有のバイナリモジュール、サポートライブラリ、もしくは他のファイル等のコンテンツを動的にインストールしてもよく、または、アプリケーションランタイム環境は、ソースコードまたはバイトコードをアーキテクチャ特有の機械コードにコンパイルして、アプリケーション性能を向上させてもよい。したがって、静的イメージからコンテナを構築する汎用コンテナ構築ツールは、これらの動的実行時拡張を捕らえるかまたはコンテナイメージを更新して実行時アーキテクチャ特有拡張を反映する能力を欠いている。アプリケ
ーションが再開されるたびに、これらの実行時拡張は、再度実行される。コンテナ内で重い重量のコンテナ構成ツールを実行することは、コンテナを構成および/または展開するのに、重量を追加すること、ならびに時間、労力、および技術を必要とすることという犠牲を払って、これらの動的実行時拡張を捕らえることが可能であってもよい。本明細書の実現例は、ソフトウェアアプリケーションの後続の実行において用いるためにソフトウェアアプリケーションによって実行環境に合わせて調整された動的および/またはアーキテクチャ固有の拡張を捕らえることを含む、ソフトウェアアプリケーションのためのセキュアな実行環境(たとえば、コンテナ)を効率的に構成および展開する方法ならびにシステムを対象とする。
【0014】
図1を参照すると、いくつかの実現例では、システム100は、例えば、ネットワーク130を介して、遠隔システム140と通信し得る、ソフトウェア開発者10と関連付けられる開発者デバイス110、110a-nを含む。遠隔システム140は、スケーラブル/弾性リソース142を有する分散型システム(例えば、クラウド環境)であってもよい。リソース142は、コンピューティングリソース(例えば、データ処理ハードウェア)144および/または記憶リソース(例えば、メモリハードウェア)146を含む。ソフトウェア開発者10は、開発者デバイス110を用いて、遠隔システム140上で実行するためのソフトウェアアプリケーション200を開発することができる。遠隔システム140はまた、ソフトウェアアプリケーション200が開発者10によってどのように開発/作成されたかとは無関係に、遠隔システム140上でソフトウェアアプリケーション200を実行するための1つ以上のセキュアな実行環境310、320(たとえば、コンテナ)を構築するためのコンテナビルダ300を実行する。ソフトウェアアプリケーション200を実行するためにコンテナを構築するための命令に関連付けられる構成を開発者10が提供することを要求する汎用コンテナ構築ツール(例えば、ドッカー)とは対照的に、コンテナビルダ300は、構成段階301中に開発者デバイス110から受信されたソフトウェアアプリケーション200に基づいてブートストラップ実行環境310(たとえば、ブートストラップコンテナ310)を自動的に構成するように構成される。ここで、ブートストラップ実行環境310は、静的コンテンツを有する静的コンテナイメージに関連付けられる。特に、汎用コンテナ構築ツール(例えば、ドッカー)で使用されるワークフローとは対照的に、構成段階301は、動的コンテンツを作成するためのコマンドを実行することなく、ブートストラップ実行環境310に関連付けられる静的イメージを構成する。ブートストラップ実行環境310は、実行環境310、320を構築または構成するためのツーリング316を含んでもよい。いくつかの実現例では、ツーリング316は、コンテナを作成、構成、および管理するためのコマンドラインツールのセットである。遠隔および/またはウェブベースのサービスを含む、他の形態のツーリング316が可能である。いくつかの実現例では、コンテナビルダ300は、起動命令のセット318を含むようにブートストラップ実行環境310を構成する。起動命令318は、ブートストラップ実行環境310を実行するときにコンテナビルダ300が取るステップを定義する。ツーリング316および起動命令318の使用は、
図3A~
図3Eを参照して以下でより詳細に説明される。
【0015】
その後、実行段階302中に、コンテナビルダ300は、ブートストラップ実行環境310を走らせて/実行して、拡張された実行環境320を動的コンテンツ(例えば、アプリケーション依存関係322)とともに構築/作成するように構成される。具体的には、コンテナビルダ300は、動的コンテンツ(例えば、アプリケーション依存関係322)でブートストラップ実行環境310を拡張することによって、ソフトウェアアプリケーション200のための拡張された実行環境320を構築する。すなわち、実行段階302中に、コンテナビルダ300は、ブートストラップ実行環境310内でソフトウェアアプリケーション200を実行する。コンテナビルダ300および/またはソフトウェアアプリケーション200は、ソフトウェアアプリケーション200の依存関係のマニフェスト2
12に基づいて動的コンテンツ(たとえば、アプリケーション依存関係322)を作成し、それによって、ブートストラップ実行環境310を動的コンテンツ322で拡張して、拡張された実行環境320を作成してもよい。その結果、コンテナビルダ300は、コンテナを構築するために静的および動的コンテンツがイメージにどのように記述されるべきかに関する命令を提供する構成(例えば、ドッカーファイル)を提供することを開発者10に要求することなく、遠隔システム140上でソフトウェアアプリケーション200を実行するための、動的コンテンツ322を含む、拡張された実行環境320を、開発者10が構築し、および任意選択肢的に展開することを可能にする。
【0016】
いくつかの実現例では、遠隔システム140は、メモリハードウェア146、520(
図5)内に1つ以上のブートストラップ実行環境310、310a~nと1つ以上の拡張された実行環境320、320a~nとを記憶するデータストア150を含む。いくつかの例では、データストア150はコンテナレジストリを含み、各実行環境310、320は、それぞれのコンテナ化されたソフトウェアアプリケーション200に関連付けられる。これらの例において、ブートストラップ実行環境310は、静的コンテンツ(たとえば、依存関係のマニフェスト212)を有する静的イメージに関連付けられる「ブートストラップコンテナ」と称されてもよく、拡張された実行環境320は、ブートストラップ実行環境310の実行中に(例えば実行段階302において)動的に作成されるコンテンツ322(たとえば、アプリケーション依存関係)を有するコンテナイメージに関連付けられる「拡張されたコンテナ」と称されてもよい。各実行環境310、320は、実行環境310、320に関連付けられるソフトウェアアプリケーション200を識別する識別子314(例えば、タグ)を含んでもよい。拡張された実行環境320はまた、拡張された実行環境320を構築した遠隔システム140のオペレーティングシステムバージョンおよび/またはプロセッサアーキテクチャなどの、拡張された実行環境320の態様を示すメタデータ324を含んでもよい。
【0017】
図示の例では、コンテナビルダ300は、開発者デバイス110から、開発者10によってローカルに開発されたソフトウェアアプリケーション200のための実行環境310、320を構築するよう、構築要求180を受信する。構築要求180は、単に、依存関係のマニフェスト212を含むソフトウェアアプリケーション200を含んでもよい。構築要求180はまた、ソフトウェアアプリケーション200に加えて、またはその代わりに、ソフトウェアアプリケーション200を識別する識別子314(例えば、タグ)を含んでもよく、コンテナビルダ300は、識別子314を用いて、データストア150からソフトウェアアプリケーション200に関連付けられるブートストラップ実行環境310を取り出してもよい。ここで、ブートストラップ実行環境310は、コンテンツに関する情報のみを含む静的イメージに関連付けられている。
【0018】
以下でより詳細に説明されるように、ブートストラップ実行環境310を受信した後、コンテナビルダ300は、ブートストラップ実行環境310を実行し、拡張された実行環境320がデータストア150から利用可能であるかどうか、例えば、それが以前に作成され、データストア150に記憶されたかどうかを判断してもよい。拡張された実行環境320が利用可能である場合、コンテナビルダ300は、少なくとも、拡張された実行環境320に関連付けられるアプリケーション依存関係322(たとえば、動的コンテンツ)をデータストア150から取り出し、ブートストラップ実行環境310の以前の初期実行中に動的に作成されたアプリケーション依存関係322を用いてブートストラップ実行環境310を拡張してもよい。ブートストラップ実行環境310は、実行環境310、320を構築または構成するためのツーリング316を含んでもよい。いくつかの例では、ブートストラップ実行環境310は、ツーリング316を用いて、拡張された実行環境320を構成し、拡張された実行環境320をデータストア150に記憶する。この筋書では、ブートストラップ実行環境310は、拡張された実行環境320を作成するためにす
でに1回実行されているので、ブートストラップ実行環境310を実行する後続のインスタンスは、動的コンテンツ(例えば、アプリケーション依存関係)を作成するための起動コマンドの実行をしないで済ますことになり、なぜならば、動的コンテンツは、データストア150から単純に、そしてより効率的に、取り出されることができるからである。
【0019】
ソフトウェアアプリケーション200(すなわち、ソフトウェアリソース)という用語は、コンピューティングデバイス(例えば、データ処理ハードウェア144、500(
図5))にタスクを実行させるコンピュータソフトウェアを指し得る。したがって、ソフトウェアアプリケーション200は、分散型システム(例えば、遠隔システム140)上にインストール、実行、展開、および/もしくは別様に実現され得る、任意のタイプまたは形態のソフトウェア、ファイル、ならびに/または実行可能コードに対応してもよい。いくつかの例では、ソフトウェアアプリケーション200は、「アプリケーション」、「アプリ」、または「プログラム」と呼ばれることがある。例示的なアプリケーションは、システム診断アプリケーション、システム管理アプリケーション、システム保守アプリケーション、ワードプロセッシングアプリケーション、スプレッドシートアプリケーション、メッセージングアプリケーション、ウェブブラウザアプリケーション、メディアストリーミングアプリケーション、ソーシャルネットワーキングアプリケーション、セキュリティアプリケーション、およびゲームアプリケーションを含むが、これらに限定されない。ソフトウェアアプリケーション200は、C/C++、Java(登録商標)、Python、Ruby、Perl
、またはJavaScript(登録商標)などの高レベルおよび構造化プログラミング言語を含む1つ以上のプログラミング言語で表現されてもよく、C/C++アプリケーション、Java(登
録商標)アプリケーション、Pythonアプリケーション、Rubyアプリケーション、Perlアプリケーション、またはJavaScript(登録商標)アプリケーションと呼ばれることがある。ソフトウェアアプリケーション200は、他の形態、フレームワーク、および/またはプログラミング言語でも表現され得る。たとえば、Node.jsフレームワークにおいて開発さ
れたJavaScriptアプリケーションは、Node.jsアプリケーションまたはJavaScriptアプリ
ケーションと呼ばれることがある。
【0020】
いくつかの例では、ソフトウェアアプリケーション200は、依存関係のマニフェスト212またはリストを含む。依存関係のマニフェスト(「依存関係マニフェスト」と相互交換可能に称される)212は、遠隔システム140上での実行中にソフトウェアアプリケーション200によって使用またはアクセスされるファイルおよび/もしくはソフトウェアライブラリまたはモジュールを列挙することができる。依存関係マニフェスト212は、ソフトウェアアプリケーション200によって使用されるアーキテクチャ固有および/またはプログラミング言語固有のサポートライブラリを含んでもよい。例えば、依存関係マニフェスト212は、Pythonプログラミング言語のためのNumPy科学コンピューティ
ングパッケージを含んでもよい。依存関係のマニフェスト212は、遠隔システム140上で実行環境310、320を構成するために、ソフトウェア開発者10によって明示的に構成されてもよい。いくつかの例では、依存関係のマニフェスト212は、ソフトウェアアプリケーション200によって暗示される。例えば、ソフトウェアアプリケーション200は、サポートライブラリを要求またはインポートするステートメントを含んでもよい。ソフトウェアアプリケーション200は、「URL解析支援ライブラリへの依存関係を示すよう要求(「urlib」)」というステートメントを含んでもよい。集合的に、その
ようなステートメントは、依存関係のマニフェスト212の一部と見なされてもよい。
【0021】
ブートストラップ実行環境310は、ソフトウェアアプリケーション200が動作環境にかかわらず一貫して実行できるように、ソフトウェアアプリケーション200を最初に実行するために必要とされるすべて、例えば、コード、ランタイム、システムツール、およびライブラリを含む完全なファイルシステムに、ソフトウェアアプリケーション200を含んでもよい。いくつかの例では、開発者デバイス110a~nは、ソフトウェアアプ
リケーション200に基づいてブートストラップ実行環境310を構築する。この場合、遠隔システム140は、開発者デバイス110a~nからブートストラップ実行環境310を受信し、ブートストラップ実行環境310をデータストア150に記憶してもよい。これらの例では、開発者デバイス110から受信された構築要求180は、ブートストラップ実行環境310を含んでもよい。データストア150に記憶された実行環境310、320は、後でデータストア150から取り出すために、インデックス付けおよび/またはカタログ化および/または識別子314を割り当てられることができる。データストア150は、「タグ」または他の注釈を用いて、各実行環境310、320に割り当てられた識別子314を表して、その後の検索および取得を容易にしてもよい。識別子314は、実行環境に関連付けられるソフトウェアアプリケーション200を識別してもよく、および/または実行環境310、320を具体的に識別してもよい。したがって、開発者デバイス110a~nからの構築要求180は、ソフトウェアアプリケーション200および/またはブートストラップ実行環境310を識別する1つ以上の識別子314を含んでもよい。データストア150は、実行環境310、320またはソフトウェアアプリケーション200への不正アクセスから保護するための認証などのセキュリティ機能を含んでもよい。
【0022】
図2A~
図2Cは、ソフトウェアアプリケーション200、200a~cおよび依存関係のそれぞれのマニフェスト212、212a~cの概略図である。
図2Aは、アプリケーション依存関係322を動的に作成するためのランタイムコマンドを含む依存関係212aのマニフェストを列挙する「.gemspec」ファイルを含む例示的なRubyソフトウェアアプリケーション200aを示す。ここで、Rubyソフトウェアアプリケーション200aのアプリケーション依存関係322は、ブートストラップ実行環境310において依存関係212aのマニフェストを実行すると動的に作成され、URL処理(curl)およびJSONデー
タ交換フォーマット(json)サポートライブラリを含む。いくつかの例では、「.gemspec」ファイルは、Rubyソフトウェアアプリケーション200aがブートストラップ実行環境310において実行されるときに動的に作成されるアプリケーション依存関係322の特定のバージョンまたはバージョンの好適な範囲を示すステートメントを含む。ここで、「.gemspec」ファイルは、バージョン0.0.9およびバージョン1.7.3がRubyソフトウェアアプリケーション200aのアプリケーション依存関係322であることを示す。いくつかの例では、「.gemspec」ファイルは、2.1より大きいが3.0より小さいjsonサポートライブラリがRubyソフトウェアアプリケーション200aのアプリケーション依存関係322であることを示すよう、ステートメント「s.add_dependency('json', '~>2.1')」を含む。コンテナビルダ300は、Rubyソフトウェアアプリケーション200aが
ブートストラップ実行環境310内で実行されるときに、「.gemspec」ファイル内に列挙された依存関係のマニフェスト212に基づいてアプリケーション依存関係322を作成することによって、ブートストラップ実行環境310を拡張することができる。Rubyソフトウェアアプリケーション200aのためにブートストラップ実行環境310を拡張するための他の技法も可能である。コンテナビルダ300は、拡張された実行環境320をデータストア150に記憶してもよい。
【0023】
図2Bを参照すると、例示的なNode.jsソフトウェアアプリケーション(例えば、JavaScriptアプリケーション200b)が示される。Node.jsソフトウェアアプリケーション200bは、アプリケーション依存関係322を動的に作成するためのランタイムコマンドを含む、依存関係のマニフェスト212bを列挙するパッケージマネージャ(npm)コマ
ンドを含む。ここで、パッケージマネージャコマンドは、データベース(mysql)パッケ
ージが、Node.jsソフトウェアアプリケーション200bがブートストラップ実行環境3
10において実行されるときに動的に作成されることになるアプリケーション依存関係322であることを示す。いくつかの例では、コンテナビルダ300は、Node.jsソフトウ
ェアアプリケーション200bがブートストラップ実行環境310内で実行されるとき、
パッケージマネージャコマンドを実行してアプリケーション依存関係322を動的に作成することによってブートストラップ実行環境310を拡張する。Node.jsソフトウェアア
プリケーション200bは、依存関係のマニフェスト212をさらに列挙するJavaScriptステートメントを含む。ここで、JavaScriptステートメントは、暗号(「crypto」)およびデータベース(「mysql」)サポートライブラリも、Node.jsソフトウェアアプリケーション200bがブートストラップ実行環境310において実行されるときに動的に作成されることになるアプリケーション依存関係322であることを示す。いくつかの例では、コンテナビルダ300は、実行時(JIT)コンパイラを含むJavaScriptエンジンにおいてNode.jsソフトウェアアプリケーション200bを実行する。コンテナビルダ300は
、ブートストラップ実行環境310を拡張するために、JITコンパイラに、Node.jsソ
フトウェアアプリケーション200bを、より効率的な機械コードに、例えば実行時にコンパイルされるモジュールに、コンパイルさせてもよい。いくつかの実現例では、コンテナビルダ300は、パッケージマネージャコマンドを実行し、Node.jsソフトウェアアプ
リケーション200bを実行して、Node.jsソフトウェアアプリケーション200bのア
プリケーション依存関係322を動的に作成してもよい。Node.jsソフトウェアアプリケ
ーション200bのためのブートストラップ実行環境310を拡張するために他の技法が可能である。コンテナビルダ300は、拡張された実行環境320をデータストア150に記憶してもよい。
【0024】
図2Bを参照すると、例示的なPythonソフトウェアアプリケーション200cが示される。Node.jsソフトウェアアプリケーション200bと同様に、Pythonソフトウェアアプ
リケーション200cは、アプリケーション依存関係322を動的に作成するためのランタイムコマンドを含む、依存関係のマニフェスト212を列挙するパッケージマネージャ(pip)コマンドを含む。ここで、パッケージマネージャコマンドは、ウェブフレームワ
ーク(django)パッケージが、Pythonソフトウェアアプリケーション200cがブートストラップ実行環境310において実行されるときに動的に作成されることになるアプリケーション依存関係322であることを示す。Pythonソフトウェアアプリケーション200cは、アプリケーション依存関係のマニフェスト212をさらに列挙するPythonステートメントを含む。ここで、Pythonステートメントは、djangoの特定のバージョン(django==1.11.0, django-braces==0.2.1, django-model-utils==1.1.0, django-oauth2-provider==0.2.4, djangorestframework==2.3.1)サポートライブラリも、Pythonソフトウェアアプリケーション200cがブートストラップ実行環境310において実行されるときに動的に作成されるアプリケーション依存関係322であることを示す。いくつかの実現例では、コンテナビルダ300は、パッケージマネージャコマンドを実行し、Pythonソフトウェアアプリケーション200cを実行して、Pythonソフトウェアアプリケーション200cのためのアプリケーション依存関係322を動的に作成する。Pythonソフトウェアアプリケーション200cのためのブートストラップ実行環境310を拡張するための他の技法が可能である。コンテナビルダ300は、拡張された実行環境320をデータストア150に記憶してもよい。
【0025】
図3A~
図3Eは、ソフトウェアアプリケーション200のために拡張された実行環境320を構築するコンテナビルダ300の概略図を示す。
図3Aを参照すると、コンテナビルダ300の構成段階301(
図1)が示される。いくつかの例では、コンテナビルダ300は、構築要求180を受信する。ここで、構築要求180は、単に、依存関係のマニフェスト212を含むソフトウェアアプリケーション200を含む。構成段階301の間、コンテナビルダ300は、ソフトウェアアプリケーション200のためにブートストラップ実行環境310を構成し、構築する。ブートストラップ実行環境310は、ソフトウェアアプリケーション200が動作環境にかかわらず一貫して実行できるように、ソフトウェアアプリケーション200を最初に実行するために必要とされるすべて、たとえばコード、ランタイム、システムツール、およびライブラリを含む完全なファイルシステム
を含んで、ソフトウェアアプリケーション200を静的イメージに含んでもよい。いくつかの例では、コンテナビルダ300は、動的コンテンツを作成することなく、すなわち、実行時アーキテクチャ固有および/または動的アプリケーション依存関係322を伴わずに、静的イメージ(たとえば、ブートストラップ実行環境310)を構成する。
【0026】
コンテナビルダ300は、実行環境310、320を構築または構成するためのツーリング316を含むようにブートストラップ実行環境310を構成することができる。いくつかの実現例では、ツーリング316は、コンテナを作成、構成、および管理するためのコマンドラインツールのセットである。ツーリング316はまた、拡張された実行環境320をデータストア150に記憶することが可能であってもよい。例えば、
図3Aは、コンテナビルダ300がブートストラップ実行環境310をデータストア150に記憶するのを示す。実行段階302に関して以下でより詳細に説明されるように、ツーリング316はまた、たとえば拡張された実行環境320が利用可能であるかどうかを判断するために、データストア150と対話することが可能であってもよい。いくつかの例では、ツーリング316は、実行環境内観が可能である。すなわち、ツーリング316は、実行環境、たとえばブートストラップ実行環境310を拡張して、拡張された実行環境320を作成するプロセス中に、ブートストラップ実行環境310内のどのファイルが追加または修正されたかを判断することが可能であってもよい。いくつかの実現例では、コンテナビルダ300は、起動命令のセット318を含むようにブートストラップ実行環境310を構成する。起動命令318は、実行段階302中にブートストラップ実行環境310を実行するときにコンテナビルダ300が実行するための動作(例えば、ステップ)を定義する。コンテナビルダ300は、起動命令318のステップを実行する際に、ブートストラップ実行環境310に含まれるツーリング316を用いてもよい。コンテナビルダ300は、ツーリング316を用いて、ブートストラップ実行環境310を含むコンテナイメージをコンテナレジストリ(例えば、データストア150)にアップロードすることができる。コンテナビルダ300は、ブートストラップ実行環境310に関連付けられるソフトウェアアプリケーション200を識別する識別子314(たとえば、タグ)をブートストラップ実行環境310に追加することができる。識別子314は、その後の検索および取得を容易にすることができる。
【0027】
図3Bを参照すると、コンテナビルダ300は、実行段階302中にブートストラップ実行環境310を実行する。コンテナビルダ300は、構成段階301(
図3A)中にブートストラップ実行環境310を構築/作成/構成した後、データストア150からブートストラップ実行環境310を(たとえば、識別子314を用いて)受信してもよい。いくつかの例では、コンテナビルダ300は、構成段階301中にブートストラップ実行環境310を作成/構成すると、実行段階302中にブートストラップ実行環境310を直ちに実行する。ブートストラップ実行環境310は、依存関係のマニフェスト212を含むソフトウェアアプリケーション200を含んでもよい。図示の例では、コンテナビルダ300はブートストラップ実行環境310を実行し、コンテナビルダ300に起動命令318を実行させる。起動命令318は、関連付けられる拡張された実行環境320がデータストア150から利用可能であるかどうかを判断することを含んでもよい。
図3Bに示す例では、データストア150は、最初は、拡張された実行環境320を含まない。したがって、コンテナビルダ300は、起動命令318を実行している間、関連付けられる拡張された実行環境320がデータストア150から利用可能ではないと判断する。例えば、コンテナビルダ300は、識別子314を用いてデータストア150に問い合わせて、データストア150が関連付けられる拡張された実行環境320を含むかどうかを判断してもよい。識別子314は、ソフトウェアアプリケーション200のバージョンに関連付けられてもよい。いくつかの例では、コンテナビルダ300は、ブートストラップ実行環境310に関連付けられ(かつ構築要求180に含まれる)ソフトウェアアプリケーション200のバージョン番号が、記憶された拡張された実行環境320に関連付けられるソ
フトウェアアプリケーション200のバージョンと同じでない場合、拡張された実行環境320は利用可能ではないと判断する。
【0028】
コンテナビルダ300が、関連付けられる拡張された実行環境320がデータストア150から利用可能ではないと判断すると、起動命令318は、依存関係のマニフェスト212に基づいてブートストラップ実行環境310を拡張するための動作/ステップを含む。コンテナビルダ300は、ブートストラップ実行環境310を拡張して、拡張された実行環境320を構築/作成/構成してもよい。コンテナビルダ300は、アプリケーション依存関係322をインストールする(例えば、ダウンロードする、コピーする、コンパイルする)ことによってブートストラップ実行環境310を拡張してもよい。いくつかの例では、コンテナビルダ300は、ソフトウェアアプリケーション200を実行する前にアプリケーション依存関係322をインストールする。前述のように、コンテナビルダ300は、依存関係のマニフェスト212に含まれるパッケージマネージャコマンドなどのコマンドを実行して、アプリケーション依存関係322を作成(例えばインストール)してもよい。いくつかの例では、コンテナビルダ300は、ソフトウェアアプリケーション200を実行して、アプリケーション依存関係322を作成する。コンテナビルダ300は、ソフトウェアアプリケーション200を実行して/走らせて、ソフトウェアアプリケーション200に、サポートライブラリ、ファイル、もしくは他のアプリケーション依存関係322を必要とするかまたはインポートするステートメントを実行させてもよい。したがって、コンテナビルダ300は、インポートされたアプリケーション依存関係322を用いてブートストラップ実行環境310を拡張して、拡張された実行環境320を作成する。コンテナビルダ300は、ソフトウェアアプリケーション200を実行して、アプリケーションソースコードまたはバイトコードなどの共通中間言語(CIL)をアーキテクチャ固有の機械コードまたはバイナリコードにコンパイルすることができる。例えば、コンテナビルダ300は、JIT実行エンジンにおいてソフトウェアアプリケーション200を実行してもよい。JITエンジンは、ソフトウェアアプリケーション200のモジュールが最初にロードまたはアクセスされるときに、ソフトウェアアプリケーション200のモジュールを、効率的な機械コードを含むJITコンパイルされたモジュールにコンパイルしてもよい。いくつかの実現例では、コンテナビルダ300は、ソフトウェアアプリケーション200を実行する前にいくつかのアプリケーション依存関係322を作成し、ソフトウェアアプリケーション200を実行/実行することによって他のアプリケーション依存関係322を作成する。コンテナビルダ300は、アプリケーション依存関係322を動的に作成するために他の技法を用いてもよい。
【0029】
動的コンテンツ(例えば、アプリケーション依存関係322)は、アーキテクチャ固有であってもよい。すなわち、アプリケーション依存関係322は、アプリケーション依存関係322を作成するためにコンテナビルダ300によって実行されるブートストラップ実行環境310に関連付けられる特定のプロセッサアーキテクチャおよび/または特定のオペレーティングシステムバージョンと互換性があってもよい。例えば、アプリケーション依存関係322は、効率的なアーキテクチャ固有の機械コードもしくはバイナリコード、および/もしくはJIT実行エンジンによって作成される、実行時にコンパイルされるモジュールを含むファイルまたはモジュールを含んでもよい。いくつかの実現例では、コンテナビルダ300が、動的に作成されたアプリケーション依存関係322を含むようにブートストラップ実行環境310を拡張した後、拡張された実行環境320は、もはや、アプリケーション依存関係322を作成することに関連付けられる起動命令318のステップを実行する必要はない。したがって、コンテナビルダ300は、拡張された実行環境320から起動命令318を省くことができる。コンテナビルダ300は、拡張された実行環境320を作成したブートストラップ実行環境310に関連付けられるオペレーティングシステムバージョンおよび/またはブートストラップ実行環境310に関連付けられるプロセッサアーキテクチャを示すメタデータ324を、拡張された実行環境320に追
加してもよい。いくつかの例では、アーキテクチャ固有コンテンツ(たとえば、アプリケーション依存関係322)は、ブートストラップ実行環境310に関連付けられるオペレーティングシステムバージョンおよび/またはプロセッサアーキテクチャを示すメタデータを含む。コンテナ構築は、拡張された実行環境320を作成/構成するために他の技法を用いてもよい。
【0030】
図3Bはまた、コンテナビルダ300が、拡張された実行環境320をデータストア150に記憶することを含む起動命令318のさらなるステップを実行するのを示す。いくつかの実現例では、コンテナビルダ300は、ツーリング316を用いて、拡張された実行環境320を記憶する。例えば、データストア150は、コンテナレジストリを含んでもよい。コンテナビルダ300は、ツーリング316を用いて、拡張された実行環境320を含むコンテナイメージを作成することができる。拡張された実行環境320は、ブートストラップ実行環境310のコンテンツ(たとえば、静的コンテンツ)と、コンテナビルダ300によって作成されたアプリケーション依存関係322(動的コンテンツ)とを含んでもよい。コンテナビルダ300は、さらに、ツーリング316を用いて、拡張された実行環境320を含むコンテナイメージをコンテナレジストリ(例えば、データストア150)にアップロードしてもよい。起動命令318は、検索および取得を容易にするために、拡張された実行環境320をタグ付けすること、注釈付けすること、インデックス付けすること、または別様に識別することをさらに含んでもよい。例えば、起動命令318は、拡張された実行環境320に識別子314を追加することを含んでもよい。例えば、識別子314は、データストア150が、ソフトウェアアプリケーション200のバージョンに関連付けられる拡張された実行環境320を含むことを示してもよい。コンテナビルダ300は、拡張された実行環境320を実行する遠隔システム140のオペレーティングシステムバージョンおよび/またはプロセッサアーキテクチャなどの、拡張された実行環境320の態様を示すために、メタデータ324を拡張された実行環境320に追加することができる。例えば、コンテナビルダ300は、メタデータ324を用いて、拡張された実行環境320に「タグ」または注釈を付けることができる。一例では、コンテナビルダ300は、拡張された実行環境320が「x86_64」アーキテクチャ上で実行されるUbuntu LINUXシステム上で作成されたことを示すメタデータ324を、拡張された実行環境320にタグ付けする。他のメタデータ324の規約またはコンテンツも同様に使用されてもよい。
【0031】
図3Cを参照すると、コンテナビルダ300は、ブートストラップ実行環境310と拡張された実行環境320との間の差分をデータストア150に記憶してもよい。すなわち、コンテナビルダ300は、例えば、データストア150内の空間を節約するために、動的に作成されたアプリケーション依存関係322のみをデータストア150内に記憶してもよい。ここで、拡張された実行環境のための動的に作成されたアプリケーション依存関係322は、データストア150に記憶されてもよく、関連付けられる識別子314(例えば、アプリケーション依存関係の、後の検索および取得のため)および/または関連付けられるメタデータ324(例えば、動的に作成されたアプリケーション依存関係に関連付けられる拡張された実行環境320を実行するための遠隔システム140のオペレーティングシステムバージョンおよび/またはプロセッサアーキテクチャなどの態様を示すため)を含んでもよい。たとえば、起動命令318は、実行段階302の間に更新または動的に作成されたアプリケーション依存関係322を識別することによってブートストラップ実行環境310と拡張された実行環境320との間の差を判断するための内観を含んでもよい。すなわち、コンテナビルダ300は、ブートストラップ実行環境310を拡張することによって追加または修正されたファイルに対応するアプリケーション依存関係322を判断/識別してもよい。コンテナビルダ300は、ブートストラップ実行環境310に含まれるツーリング316を用いて、更新されたファイルのセット、すなわち、コンテナビルダ300が動的コンテンツ(たとえば、アプリケーション依存関係322)を追加
することによってブートストラップ環境310を拡張したときに追加または修正されたファイルを識別してもよい。いくつかの実現例では、コンテナビルダ300は、標準的なオペレーティングシステムコマンドまたはプログラミングインターフェイスを用いて、依存関係のマニフェスト212に基づいてブートストラップ実行環境310を拡張することによって追加または修正されたファイルを判断する。例えば、コンテナビルダ300は、UNIX(登録商標)「find」コマンドを用いて、変更されたファイルを再帰的に検索することができる。コンテナビルダ300は、ブートストラップ実行環境310に対する拡張を判断するために他の技法を用いることができる。いくつかの実現例では、コンテナビルダ300は、最近追加または修正されたファイルに基づいてUNIX(登録商標)「tar」ファイ
ルを作成する。コンテナビルダ300は、「tar」ファイルを拡張された実行環境320
としてデータストア150に記憶し、「tar」ファイルをタグ付けして、拡張された実行
環境320が、完全に実行可能な拡張された実行環境320ではなく、アプリケーション依存関係322のみを含む差分を含むことを示してもよい。その後ブートストラップ実行環境310が実行されると、コンテナビルダ300は、データストア150から受信される「tar」ファイル内のアプリケーション依存関係322に基づいてブートストラップ実
行環境310を拡張してもよい。
【0032】
関連付けられる拡張された実行環境320がデータストア150から利用可能ではないとコンテナビルダが判断した
図3Bに示される例とは対照的に、
図3Dは、コンテナビルダ300が、起動命令318を実行している間に、関連付けられる拡張された実行環境320がデータストア150から利用可能である(例えば、データストア150は、関連付けられる拡張された実行環境320を含む)、と判断するのを示す。いくつかの例においては、コンテナビルダ300は、拡張された実行環境320を以前に作成しており、データストア150に記憶していた。以前に作成された実行環境320は、拡張された実行環境320をソフトウェアアプリケーション200のバージョンと関連付ける識別子314を含んでもよい。コンテナビルダ300は、拡張された実行環境320がソフトウェアアプリケーション200の好適なバージョン(例えば、バージョン番号)を含むことを示す「タグ」(例えば、識別子314)を、拡張された実行環境320が含む場合に、拡張された実行環境320は利用可能である、と判断してもよい。いくつかの例では、バージョン番号は、メジャーバージョン番号およびマイナーバージョン番号を含む。これらの例では、コンテナビルダ300は、ブートストラップ実行環境310に関連付けられるソフトウェアアプリケーション200のメジャーソフトウェアバージョン番号が、記憶される拡張された実行環境320に関連付けられるソフトウェアアプリケーション200のメジャーバージョンと同じである場合、関連付けられる拡張された実行環境320はデータストア150から利用可能である、と判断してもよい。
【0033】
関連付けられる拡張された実行環境320は、拡張された実行環境320を構築するために使用される遠隔システム140のオペレーティングシステムバージョンおよび/またはプロセッサアーキテクチャなどの、拡張された実行環境320の態様を示すメタデータ324を含んでもよい。拡張された実行環境320は、メタデータ324を含む注釈またはタグを含んでもよい。コンテナビルダ300は、拡張された実行環境320を構築した遠隔システム140のオペレーティングシステムバージョンおよび/またはプロセッサアーキテクチャなど、拡張された実行環境320の態様が好適であることを示すメタデータ324を拡張された実行環境320が含む場合、拡張された実行環境320は利用可能である、と判断してもよい。たとえば、コンテナビルダ300は、メタデータ324がブートストラップ実行環境310と互換性がない(例えば、ブートストラップ実行環境310を実行する遠隔システム140とは互換性がない)プロセッサアーキテクチャを示すとき、拡張された実行環境320はデータストア150から利用可能ではない、と判断してもよい。この例では、コンテナビルダ300は、
図3Bを参照して上述したように、依存関係のマニフェスト212に基づいてブートストラップ実行環境310を拡張することによ
って起動命令318を実行することに進むことになる。代替として、コンテナビルダ300は、拡張された実行環境320に関連付けられるメタデータ324が、ブートストラップ実行環境310と互換性があるオペレーティングシステムバージョンおよびプロセッサアーキテクチャを示すとき、拡張された実行環境320はデータストア150から利用可能である、と判断してもよい。コンテナビルダ300は、他の技法を用いて、拡張された実行環境320がデータストア150から利用可能であるかどうかを判断してもよい。コンテナビルダ300は、ブートストラップ実行環境310に含まれるツーリング316を用いて、関連付けられる拡張された実行環境320が利用可能であるかどうかを判断してもよい。例えば、データストア150は、コンテナレジストリを含んでもよい。この例では、ツーリング316は、コンテナレジストリ(例えば、データストア150)内で好適な拡張された実行環境320を検索することが可能であってもよい。ツールは、ソフトウェアバージョン識別子314および/またはメタデータ324を用いて、または好適な拡張された実行環境320がデータストア150から利用可能であることを判断するために他の技法を用いて、拡張された実行環境320を検索してもよい。
【0034】
図示の例では、コンテナビルダ300が、関連付けられる拡張された実行環境320がデータストア150から利用可能である、と判断すると、コンテナビルダ300は、拡張された実行環境320をデータストア150から受信し、拡張された実行環境320に基づいてブートストラップ実行環境310を拡張する。コンテナビルダ300は、データストア150からソフトウェアアプリケーション200を含む拡張された実行環境320をダウンロードすることによって、拡張された実行環境320を受信し、静的コンテンツのみを有するブートストラップ実行環境310の代わりに、動的コンテンツ(たとえば、アプリケーション依存関係322)を有するダウンロードされた拡張された実行環境320を単に実行することによって、ブートストラップ実行環境310を拡張してもよい。別の例では、ダウンロードされた拡張された実行環境320を実行する代わりに、コンテナビルダ300は、ダウンロードされた拡張された実行環境320に含まれるアプリケーション依存関係322に基づいてブートストラップ実行環境310を拡張する。例えば、コンテナビルダ300は、ツーリング316を用いて、アプリケーション依存関係322をデータストア150内の関連付けられる拡張された実行環境320からブートストラップ実行環境310にダウンロードおよびインストールしてもよい。拡張された実行環境320に基づいてブートストラップ実行環境310を拡張することは、依存関係のマニフェスト212に基づいてブートストラップ実行環境310を拡張することよりも効率的であり得る。
【0035】
図3Cに関して上述したように、コンテナビルダ300は、ブートストラップ実行環境310と拡張された実行環境320との間の差分(すなわち、動的に作成されたアプリケーション依存関係322)をデータストア150に記憶してもよい。
図3Eを参照すると、コンテナビルダ300が、関連付けられる拡張された実行環境320がデータストア150から利用可能であるかどうかについて起動命令318を実行するとき、コンテナビルダ300は、好適な差分がデータストア150から利用可能である、と判断してもよい。ここで、差分は、例えばブートストラップ実行環境310におけるソフトウェアアプリケーション200の以前の実行中に動的に作成され、コンパイルされ、ダウンロードされ、またはそうでなければマーシャリングされたアプリケーション依存関係322を含むコンテナイメージを含んでもよい。前述のように、コンテナビルダ300は、受信したブートストラップ実行環境310の識別子314を用いて、データストア150内のアプリケーション依存関係322を含む関連付けられる差分を検索してもよい。例えば、コンテナビルダ300は、差分が遠隔システム140と同じオペレーティングシステムバージョンおよび/または同じプロセッサアーキテクチャを用いて生成されたことを示す「タグ」(例えば、識別子314)を、差分が含むとき、差分はデータストア150から利用可能である、と判断してもよい。いくつかの例では、コンテナビルダ300は、アプリケーション
依存関係322を含むUNIX(登録商標)「tar」ファイルを含むコンテナイメージ(たと
えば、拡張された実行環境320)をデータストア150から受信する。コンテナビルダ300は、データストア150から受信されたコンテナイメージに含まれるアプリケーション依存関係322に基づいてブートストラップ実行環境310を拡張してもよい。コンテナビルダ300は、ツーリング316を用いて、データストア150からコンテナイメージをダウンロードし、アプリケーション依存関係322をインストールすることによってブートストラップ実行環境310を拡張してもよい。例えば、コンテナビルダ300は、「tar」ファイルからアプリケーション依存関係322を抽出してもよい。コンテナビ
ルダ300は、拡張された実行環境320に基づいてブートストラップ実行環境310を拡張するために他の技法を用いてもよい。
【0036】
いくつかの例では、実行段階302中にブートストラップ実行環境310を拡張した後、コンテナビルダ300はソフトウェアアプリケーション200を実行する。あるいは、コンテナビルダ300は、ブートストラップ実行環境310内でソフトウェアアプリケーション200を実行して、アプリケーション依存関係322を作成(すなわち、拡張された実行環境320を作成)してもよい。この例では、ソフトウェアアプリケーション200は、拡張された実行環境320において続行してもよい。言い換えれば、起動命令318のステップ/動作の順序、例えば、拡張された実行環境320を作成するステップ、およびソフトウェアアプリケーション200を実行するステップは、示される例から変更されてもよい。
【0037】
図4は、アプリケーション実行環境においてソフトウェアアプリケーション200を実行する方法400のための動作の例示的な構成のフローチャートを提供する。ソフトウェアアプリケーションは、JavaScriptアプリケーション、Pythonアプリケーション、またはRubyアプリケーションのうちの1つであってもよい。動作402において、方法400は、データ処理ハードウェア144(例えば、コンテナビルダ300)において、データストア150からブートストラップ実行環境310を受信することを含む。ブートストラップ実行環境310はソフトウェアアプリケーション200を含み、ソフトウェアアプリケーション200は依存関係のマニフェスト212を含む。いくつかの実現例では、データストア150は、ブートストラップ実行環境310を含むコンテナイメージを記憶するコンテナレジストリを含む。
【0038】
動作404において、方法400は、データ処理ハードウェア144が、ブートストラップ実行環境310を実行して、データ処理ハードウェア144に(たとえば、ブートストラップ実行環境310に関連付けられる起動命令318を実行することによって)動作を実行させることを含む。動作406において、方法400は、拡張された実行環境320がデータストア150から利用可能であるかどうかを判断することを含む。たとえば、拡張された実行環境320がデータストア150から利用可能であるかどうかを判断することは、拡張された実行環境320が、ソフトウェアアプリケーション200、ブートストラップ実行環境320に関連付けられるオペレーティングシステムバージョン、またはブートストラップ実行環境320に関連付けられるプロセッサアーキテクチャのうちの少なくとも1つと互換性があるかどうかを判断することを含んでもよい。
【0039】
拡張された実行環境320がデータストア150から利用可能である場合、方法400は、動作408において、拡張された実行環境320をデータストア150から受信することを含む。データストア150から拡張された実行環境320を受信した後、方法400は、動作410において、拡張された実行環境320に基づいてブートストラップ実行環境310を拡張することを含む。たとえば、ブートストラップ実行環境310を拡張することは、拡張された実行環境320に基づいてアプリケーション依存関係322をインストールすることを含んでもよい。アプリケーション依存関係322は、サポートライブ
ラリ、アーキテクチャ固有のバイナリモジュール、または実行時にコンパイルされるモジュールのうちの少なくとも1つを含んでもよい。拡張された実行環境320に基づいてブートストラップ実行環境310を拡張した後、方法400は、動作416において、ソフトウェアアプリケーション200を実行することを含む。
【0040】
拡張された実行環境320がデータストア150から利用可能ではない場合、方法400は、動作412において、拡張された実行環境320を作成するために、依存関係のマニフェスト212に基づいてブートストラップ実行環境310を拡張することを含む。拡張された実行環境320を作成するために依存関係のマニフェスト212に基づいてブートストラップ実行環境310を拡張した後、方法400は、動作414において、拡張された実行環境320をデータストア150に記憶することを含む。いくつかの実現例では、方法400は、データ処理ハードウェア144が、データストア150内の拡張された実行環境320に注釈を付けて、ソフトウェアアプリケーション200のバージョン、拡張された実行環境320に関連付けられるオペレーティングシステムバージョン、または拡張された実行環境320に関連付けられるプロセッサアーキテクチャのうちの少なくとも1つを示すことも含む。拡張された実行環境320をデータストア150に記憶した後、方法400は、動作416において、ソフトウェアアプリケーション200を実行することを含む。
【0041】
図5は、本明細書で説明するシステムおよび方法(たとえば、方法400)を実施するために使用され得る例示的なコンピューティングデバイス500の概略図である。コンピューティングデバイス500は、ラップトップ、デスクトップ、ワークステーション、携帯情報端末、サーバ、ブレードサーバ、メインフレーム、および他の適切なコンピュータなど、様々な形態のデジタルコンピュータを表すことが意図されている。本明細書に示された構成要素、それらの接続および関係、ならびにそれらの機能は、例示的なものにすぎず、本文書に記載および/または特許請求される本発明の実現例を限定するものではない。
【0042】
コンピューティングデバイス500は、プロセッサ510(データ処理ハードウェアとも呼ばれる)と、メモリ520(メモリハードウェアとも呼ばれる)と、ストレージデバイス530と、メモリ520および高速拡張ポート550に接続する高速インターフェイス/コントローラ540と、低速バス570およびストレージデバイス530に接続する低速インターフェイス/コントローラ560とを含む。構成要素510,520,530,540,550,および560の各々は、様々なバスを用いて相互接続され、共通のマザーボード上に、または必要に応じて他の方法で実装されてもよい。プロセッサ510は、高速インターフェイス540に結合されたディスプレイ580などの外部入力/出力装置上にグラフィカルユーザインターフェイス(GUI)のためのグラフィカル情報を表示するために、メモリ520またはストレージデバイス530に記憶された命令を含む、コンピューティングデバイス500内で実行するための命令を処理することができる。他の実現例では、複数のプロセッサおよび/または複数のバスが、必要に応じて、複数のメモリおよびメモリのタイプとともに用いられてもよい。また、複数のコンピューティングデバイス500が接続されてもよく、各デバイスは、(たとえば、サーババンクとして、ブレードサーバのグループとして、またはマルチプロセッサシステムとして)必要な動作の部分を提供する。
【0043】
メモリ520は、コンピューティングデバイス500内で情報を非一時的に記憶する。メモリ520は、コンピュータ可読媒体、揮発性メモリユニット、または不揮発性メモリユニットであってもよい。非一時的メモリ520は、コンピューティングデバイス500による使用のためにプログラム(例えば、命令のシーケンス)またはデータ(例えば、プログラム状態情報)を一時的または永続的に記憶するために用いられる物理デバイスであ
ってもよい。不揮発性メモリの例は、フラッシュメモリおよび読み出し専用メモリ(ROM)/プログラマブル読み出し専用メモリ(PROM)/消去可能プログラマブル読み出し専用メモリ(EPROM)/電子的消去可能プログラマブル読み出し専用メモリ(EEPROM)(たとえば、ブートプログラムなどのファームウェアに典型的に用いられる)を含むが、これらに限定されない。揮発性メモリの例には、ランダムアクセスメモリ(RAM)、ダイナミックランダムアクセスメモリ(DRAM)、スタティックランダムアクセスメモリ(SRAM)、相変化メモリ(PCM)、およびディスクまたはテープが含まれるが、これらに限定されない。
【0044】
ストレージデバイス530は、コンピューティングデバイス500のための大容量ストレージを提供することができる。いくつかの実現例では、ストレージデバイス530はコンピュータ可読媒体である。様々な異なる実現例では、ストレージデバイス530は、フロッピー(登録商標)ディスクデバイス、ハードディスクデバイス、光ディスクデバイス、もしくはテープデバイス、フラッシュメモリもしくは他の同様のソリッドステートメモリデバイス、またはストレージエリアネットワークもしくは他の構成におけるデバイスを含むデバイスのアレイであってもよい。さらなる実現例では、コンピュータプログラム製品は、情報担体において有形に具現化される。コンピュータプログラム製品は、実行されると上述の方法などの1つ以上の方法を実行する命令を含む。情報担体は、メモリ520、ストレージデバイス530、またはプロセッサ510上のメモリなどのコンピュータ可読媒体または機械可読媒体である。
【0045】
高速コントローラ540は、コンピューティングデバイス500のための帯域幅集約型動作を管理し、低速コントローラ560は、より低い帯域幅集約型動作を管理する。そのような役割の割り当ては、例示的なものにすぎない。いくつかの実現例では、高速コントローラ540は、メモリ520、ディスプレイ580(たとえば、グラフィックスプロセッサまたはアクセラレータを通して)、および様々な拡張カード(図示せず)を受け入れ得る高速拡張ポート550に結合される。いくつかの実現例では、低速コントローラ560は、ストレージデバイス530および低速拡張ポート590に結合される。低速拡張ポート590は、様々な通信ポート(たとえば、USB、Bluetooth(登録商標)、イーサ
ネット(登録商標)、無線イーサネット(登録商標))を含んでもよく、キーボード、ポインティングデバイス、スキャナ、またはスイッチもしくはルータなどのネットワーキングデバイスなどの1つ以上の入力/出力装置に、たとえばネットワークアダプタを介して結合されてもよい。
【0046】
コンピューティングデバイス500は、図に示されるように、いくつかの異なる形態で実現されてもよい。例えば、標準サーバ500aとして、もしくはそのようなサーバ500aのグループ内で複数回、ラップトップコンピュータ500bとして、またはラックサーバシステム500cの一部として実装されてもよい。
【0047】
本明細書に記載のシステムおよび技術のさまざまな実現例は、デジタル電子および/もしくは光学回路系、集積回路系、特別に設計されたASIC(特定用途向け集積回路)、コンピュータハードウェア、ファームウェア、ソフトウェア、ならびに/またはそれらの組合せで実現されてもよい。これらのさまざまな実現例は、少なくとも1つのプログラマブルプロセッサを含むプログラマブルシステム上で実行可能および/または解釈可能な1つ以上のコンピュータプログラムにおける実現例を含んでいてもよく、当該プロセッサは専用であっても汎用であってもよく、ストレージシステム、少なくとも1つの入力装置、および少なくとも1つの出力装置からデータおよび命令を受信するように、かつこれらにデータおよび命令を送信するように結合されている。
【0048】
これらのコンピュータプログラム(プログラム、ソフトウェア、ソフトウェアアプリケ
ーションまたはコードとしても知られる)は、プログラム可能なプロセッサのための機械命令を含み、高水準手続き型および/もしくはオブジェクト指向型プログラミング言語で、ならびに/またはアセンブリ/機械言語で実現することができる。本明細書で使用されるとき、用語「機械可読媒体」および「コンピュータ可読媒体」は、機械命令を機械可読信号として受信する機械可読媒体を含む、機械命令および/またはデータをプログラマブルプロセッサに提供するよう使用される任意のコンピュータプログラム製品、非一時的コンピュータ可読媒体、装置および/またはデバイス(例えば、磁気ディスク、光ディスク、メモリ、プログラマブルロジックデバイス(PLD))を指す。「機械可読信号」という用語は、機械命令および/またはデータをプログラマブルプロセッサに提供するために使用される任意の信号を指す。
【0049】
本明細書に記載されるプロセスおよび論理フローは、入力データを操作し出力を生成することにより機能を実行するよう1つ以上のプログラマブルプロセッサが1つ以上のコンピュータプログラムを実行することによって実行され得る。プロセスおよび論理フローはまた、専用論理回路、たとえば、FPGA(フィールドプログラマブルゲートアレイ)またはASIC(特定用途向け集積回路)によって実行され得る。コンピュータプログラムの実行に好適であるプロセッサは、例として、汎用マイクロプロセッサおよび特殊目的マイクロプロセッサの両方、ならびに任意の種類のデジタルコンピュータの任意の1つ以上のプロセッサを含む。概して、プロセッサは、読み取り専用メモリもしくはランダムアクセスメモリまたは両方から命令およびデータを受信することになる。コンピュータの必須要素は、命令を実行するためのプロセッサ、ならびに命令およびデータを記憶するための1つ以上のメモリデバイスである。一般に、コンピュータはさらに、たとえば磁気ディスク、光磁気ディスクまたは光ディスクといった、データを格納するための1つ以上の大容量記憶装置を含むか、当該1つ以上の大容量記憶装置からデータを受取るかもしくは当該1つ以上の大容量記憶装置にデータを転送するよう作動的に結合されるか、またはその両方を行うことにもなる。しかしながら、コンピュータは、そのようなデバイスを有する必要はない。コンピュータプログラム命令およびデータを記憶するのに好適なコンピュータ可読媒体は、例として、半導体メモリデバイス、たとえば、EPROM、EEPROM、およびフラッシュメモリデバイス;磁気ディスク、たとえば内蔵ハードディスクまたはリムーバブルディスク;光磁気ディスク;およびCD ROMおよびDVD-ROMディスクを含む、あらゆる形態の不揮発性メモリ、媒体、ならびにメモリデバイスを含む。プロセッサおよびメモリは、特殊目的論理回路によって補足され得るか、または特殊目的論理回路に組み込まれ得る。
【0050】
ユーザとの対話を提供するために、本開示の1つ以上の局面は、たとえばCRT(陰極線管)、LCD(液晶ディスプレイ)モニタまたはタッチスクリーンといったユーザに対して情報を表示するための表示装置と、選択肢的にキーボードおよびたとえばマウス、トラックボールといったユーザがコンピュータに入力を提供可能であるポインティングデバイスとを有するコンピュータ上で実現され得る。他の種類のデバイスを用いて、ユーザとの対話を提供することもでき、たとえば、ユーザに提供されるフィードバックは、任意の形態の感覚フィードバック、たとえば、視覚フィードバック、聴覚フィードバック、または触覚フィードバックであり得、ユーザからの入力は、音響入力、音声入力、または触覚入力を含む、任意の形態で受信することができる。加えて、コンピュータは、ユーザが用いるデバイスにドキュメントを送信し、ユーザが用いるデバイスからドキュメントを受信することによって、たとえば、ユーザのクライアントデバイス上のウェブブラウザから受信された要求に応答してそのウェブブラウザにウェブページを送信することによって、ユーザと対話し得る。
【0051】
いくつかの実現例について説明した。それにもかかわらず、本開示の精神および範囲から逸脱することなく、様々な修正がなされ得ることが理解されるであろう。したがって、
他の実現例は特許請求の範囲内にある。