バインドマウント - Amazon ECS

バインドマウント

バインドマウントでは、ホスト (AWS Fargate など) 上のファイルまたはディレクトリがコンテナにマウントされますバインドマウントは、それらを使用しているコンテナのライフサイクルに紐付けられています。タスクが停止するなど、バインドマウントを使用するすべてのコンテナが停止すると、データが削除されます。詳細については、Docker ドキュメントの 「バインドマウントの使用」を参照してください。

バインドマウントの一般的なユースケースは以下のとおりです。

  • 1 つ以上のコンテナにマウントするための空のデータボリュームを提供する。

  • Dockerfile から 1 つ以上のコンテナにパスとその内容を公開する。

バインドマウントを使用するときの考慮事項

バインドマウントを使用する際には、以下の点を考慮してください。

  • プラットフォームバージョンの 1.4.0 以降 (Linux) または 1.0.0 以降 (Windows) を使用して AWS Fargate でホストされているタスクの場合、デフォルトでは、バインドマウント用に最低 20 GiB のエフェメラルストレージが割り当てられます。エフェメラルストレージの総量は、最大 200 GiB まで増やすことができます。ephemeralStorage オブジェクトを、タスク定義に追加します。

  • タスクの実行時に Dockerfile のファイルをデータボリュームに公開するために、Amazon ECS データプレーンが VOLUME ディレクティブを探します。VOLUME ディレクティブで指定された絶対パスが、タスク定義で指定された containerPath と同じである場合、VOLUME ディレクティブパス内のデータがデータボリュームにコピーされます。次の Dockerfile の例では、/var/log/exported ディレクトリにある examplefile という名前のファイルがホストに書き込まれ、その後でコンテナ内にマウントされます。

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN mkdir -p /var/log/exported RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"]

    デフォルトでは、ボリューム許可は 0755 に設定され、所有者は root に設定されます。これらのアクセス許可は Dockerfile でカスタマイズできます。次の例では、ディレクトリの所有者を node として定義しています。

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN yum install -y shadow-utils && yum clean all RUN useradd node RUN mkdir -p /var/log/exported && chown node:node /var/log/exported RUN touch /var/log/exported/examplefile USER node VOLUME ["/var/log/exported"]

タスク定義でバインドマウントを指定する

Fargate のでホストされている Amazon ECS タスクについては、次のタスク定義の JSON スニペットで、タスク定義の volumesmountPoints、および ephemeralStorage オブジェクトの構文を確認できます。

{ "family": "", ... "containerDefinitions" : [ { "mountPoints" : [ { "containerPath" : "/path/to/mount_volume", "sourceVolume" : "string" } ], "name" : "string" } ], ... "volumes" : [ { "name" : "string" } ], "ephemeralStorage": { "sizeInGiB": integer } }

以下では、各タスク定義パラメータについて詳しく説明します。

name

型: 文字列

必須: いいえ

ボリュームの名前。最大 255 文字の英字 (大文字と小文字)、数字、ハイフン、アンダースコアを使用できます。この名前は、コンテナ定義 sourceVolumemountPoints パラメータで参照されます。

mountPoints

タイプ: オブジェクト配列

必須: いいえ

コンテナでのデータボリュームのマウントポイント。

このパラメータは、Docker Remote APIコンテナの作成セクションにVolumesにマップされ、--volumeオプションはdocker runにマップされます。

Windows コンテナは $env:ProgramData と同じドライブに全部のディレクトリをマウントできます。Windows コンテナは、別のドライブにディレクトリをマウントできません。また、マウントポイントは複数のドライブにまたがることはできません。

sourceVolume

型: 文字列

必須: はい (mountPoints を使用する場合)

マウントするボリュームの名前。

containerPath

型: 文字列

必須: はい (mountPoints を使用する場合)

ボリュームをマウントするコンテナ上のパス。

readOnly

タイプ: ブール値

必須: いいえ

この値が true の場合、コンテナはボリュームへの読み取り専用アクセスを許可されます。この値が false の場合、コンテナはボリュームに書き込むことができます。デフォルト値は false です。

ephemeralStorage

タイプ: オブジェクト

必須: いいえ

タスクに割り当てるエフェメラルストレージの容量(GB)。このパラメータは、AWS Fargate プラットフォームバージョン 1.4.0 以降 (Linux) または 1.0.0 以降 (Windows) を使用してホストされているタスクの場合、利用可能なエフェメラルストレージの総量をデフォルト容量を超えて拡張するために使用されます。

コパイロットCLI、CloudFormation、AWSSDK または CLI を使用して、バインドマウントのエフェメラルストレージを指定します。

バインドマウントの例

以下の例では、コンテナにバインドマウントを使用する場合の最も一般的なユースケースについて説明します。

Fargate タスク用の一時ストレージ容量の増加を割り当てるには

プラットフォームバージョン 1.4.0 以降 (Linux) または 1.0.0 (Windows) を使用して Fargate でホストされる Amazon ECS タスクの場合、使用するタスク内のコンテナに対して、デフォルト容量を超えるエフェメラルストレージを割り当てることができます。この例は、他の例に組み込むことで、Fargate タスクに一時ストレージを割り当てることができます。

  • タスク定義で、ephemeralStorageオブジェクトを定義します。sizeInGiB21および200 の値の間にある整数である必要があり、GiB に表されます。

    "ephemeralStorage": { "sizeInGiB": integer }

1 つまたは複数のコンテナに空のデータボリュームを提供する

場合によっては、タスク内のコンテナにスクラッチスペースを提供することがあります。例えば、タスクの実行中に同じスクラッチファイルの保存場所にアクセスする必要のある、2 つのデータベースコンテナがあるとします。これは、バインドマウントを使用して実現できます。

  1. タスク定義の volumes セクションで、名前を database_scratch としてバインドマウントを定義します。

    "volumes": [ { "name": "database_scratch", } ]
  2. containerDefinitions セクションで、データベースのコンテナ定義を作成します。これにより、ボリュームがマウントされます。

    "containerDefinitions": [ { "name": "database1", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] }, { "name": "database2", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] } ]

Dockerfile 内のパスとその内容をコンテナに公開する

この例には、コンテナ内にマウントするデータを書き込む Dockerfile があります。

  1. Dockerfile を作成します。次の例では、パブリックな Amazon Linux 2 コンテナイメージを使用して、コンテナ内にマウントする /var/log/exported ディレクトリに examplefile という名前のファイルを作成します。VOLUME ディレクティブは絶対パスを指定する必要があります。

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN mkdir -p /var/log/exported RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"]

    デフォルトでは、ボリューム許可は 0755 に設定され、所有者は root に設定されます。これらのアクセス許可は Dockerfile で変更できます。以下の例では、/var/log/exported ディレクトリの所有者が node に設定されています。

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN yum install -y shadow-utils && yum clean all RUN useradd node RUN mkdir -p /var/log/exported && chown node:node /var/log/exported RUN touch /var/log/exported/examplefile USER node VOLUME ["/var/log/exported"]
  2. タスク定義の volumes セクションで、名前を application_logs としてボリュームを定義します。

    "volumes": [ { "name": "application_logs", } ]
  3. containerDefinitions セクションで、アプリケーションのコンテナ定義を作成します。これにより、ストレージがマウントされます。containerPath 値は、Dockerfile の VOLUME ディレクティブで指定された絶対パスと一致する必要があります。

    "containerDefinitions": [ { "name": "application1", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] }, { "name": "application2", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] } ]