Amazon ECS のバインドマウントの例
以下の例では、コンテナにバインドマウントを使用する場合の一般的なユースケースについて説明します。
Fargate タスク用の一時ストレージ容量の増加を割り当てるには
プラットフォームバージョン 1.4.0
以降 (Linux) または 1.0.0
(Windows) を使用して Fargate でホストされる Amazon ECS タスクの場合、使用するタスク内のコンテナに対して、デフォルト容量を超えるエフェメラルストレージを割り当てることができます。この例は、他の例に組み込むことで、Fargate タスクに一時ストレージを割り当てることができます。
-
タスク定義で、
ephemeralStorage
オブジェクトを定義します。sizeInGiB
は21
および200
の値の間にある整数である必要があり、GiB に表されます。"ephemeralStorage": { "sizeInGiB":
integer
}
1 つまたは複数のコンテナに空のデータボリュームを提供する
場合によっては、タスク内のコンテナにスクラッチスペースを提供することがあります。例えば、タスクの実行中に同じスクラッチファイルの保存場所にアクセスする必要のある、2 つのデータベースコンテナがあるとします。これは、バインドマウントを使用して実現できます。
-
タスク定義の
volumes
セクションで、名前をdatabase_scratch
としてバインドマウントを定義します。"volumes": [ { "name": "
database_scratch
" } ] -
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 があります。この例は、Fargate または Amazon EC2 インスタンスでホストされているタスクで機能します。
-
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 && chownnode
:node
/var/log/exported USERnode
RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"] -
タスク定義の
volumes
セクションで、名前をapplication_logs
としてボリュームを定義します。"volumes": [ { "name": "
application_logs
" } ] -
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
" } ] } ]
ホスト Amazon EC2 インスタンスのライフサイクルに紐付けされているコンテナに、空のデータボリュームを提供するには
Amazon EC2 インスタンスでホストされているタスクの場合、バインドマウントを使用して、ホスト Amazon EC2 インスタンスのライフサイクルにデータを紐付けすることができます。これは、host
パラメータを使用して sourcePath
値を指定することで設定できます。sourcePath
に存在するファイルはすべて、containerPath
の値でコンテナに表示されます。containerPath
に書き込まれたファイルは、ホストの Amazon EC2 インスタンス上の sourcePath
値に書き込まれます。
重要
Amazon ECS は、Amazon EC2 インスタンス間でストレージを同期しません。永続的ストレージを使用するタスクは、使用可能なキャパシティーのあるクラスター内の Amazon EC2 インスタンスに配置できます。タスクを停止して再び開始した後に永続的ストレージが必要な場合は、タスクの開始時に毎回 AWS CLI の start-task コマンドを使用して、同一の Amazon EC2 インスタンスを指定し直す必要があります。永続ストレージに Amazon EFS ボリュームを使用することもできます。詳細については、「Amazon ECS での Amazon EFS ボリュームの使用」を参照してください。
-
タスク定義の
volumes
セクションで、name
およびsourcePath
値を使用して、バインドマウントを定義します。次の例では、ホスト Amazon EC2 インスタンスはコンテナ内にマウントしたい/ecs/webdata
のデータを含めます。"volumes": [ { "name": "
webdata
", "host": { "sourcePath": "/ecs/webdata
" } } ] -
containerDefinitions
セクションで、定義したバインドマウントの名前を参照するmountPoints
値と、コンテナにバインドマウントをマウントするためのcontainerPath
値を使用して、コンテナを定義します。"containerDefinitions": [ { "name": "web", "image": "public.ecr.aws/docker/library/nginx:latest", "cpu": 99, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "
webdata
", "containerPath": "/usr/share/nginx/html
" } ] } ]
定義したボリュームを異なる場所にある複数のコンテナにマウントする
タスク定義でデータボリュームを定義し、そのボリュームをさまざまなコンテナのさまざまな場所にマウントできます。例えば、ホストコンテナの /data/webroot
に、ウェブサイトのデータフォルダがあるとします。そのデータボリュームを、異なるドキュメントルートを持つ 2 つの異なる Web サーバーに、読み取り専用としてマウントしたい場合があります。
-
タスク定義の
volumes
セクションで、名前をwebroot
、ソースパスを/data/webroot
としてデータボリュームを定義します。"volumes": [ { "name": "
webroot
", "host": { "sourcePath": "/data/webroot
" } } ] -
containerDefinitions
セクションで、各ウェブサーバーのコンテナを定義しています。各コンテナのmountPoints
で、webroot
ボリュームを、そのコンテナのドキュメントルートを参照するcontainerPath
値に関連付けます。"containerDefinitions": [ { "name": "
web-server-1
", "image": "my-repo/ubuntu-apache
", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot
", "containerPath": "/var/www/html
", "readOnly": true } ] }, { "name": "web-server-2
", "image": "my-repo/sles11-apache
", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 8080, "hostPort": 8080 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot
", "containerPath": "/srv/www/htdocs
", "readOnly": true } ] } ]
volumesFrom
を使用して別のコンテナからボリュームをマウントするには
Amazon EC2 インスタンスでホストされているタスクの場合、あるコンテナに 1 つ以上のボリュームを定義し、(同じタスクの) 異なるコンテナ定義で volumesFrom
パラメータを使用して、sourceContainer
のすべてのボリュームを、最初に定義されていたマウントポイントにマウントできます。volumesFrom
パラメータは、タスク定義で定義されたボリューム、および Dockerfile でイメージに組み込まれたボリュームに適用されます。
-
(オプション) イメージに組み込まれているボリュームを共有するには、Dockerfile の
VOLUME
命令を使用します。次の Dockerfile の例では、httpd
イメージを使用しボリュームを追加して、それを Apache ドキュメントルートのdockerfile_volume
にマウントしています。これは、httpd
ウェブサーバーが使用するフォルダーです。FROM httpd VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]
この Dockerfile を使用してイメージを構築し、Docker ハブなどのレポジトリにプッシュして、タスク定義で使用できます。以下のステップで使用する
my-repo/httpd_dockerfile_volume
イメージ例は、上記の Dockerfile から構築したものです。 -
コンテナの他のボリュームとマウントポイントを定義するタスク定義を作成します。この例の
volumes
セクションでは、Docker デーモンによって管理される空のボリュームempty
を作成します。また、host_etc
と呼ばれるホストボリュームも定義されています。これは、ホストコンテナインスタンス上の/etc
フォルダをエクスポートします。{ "family": "test-volumes-from", "volumes": [ { "name": "empty", "host": {} }, { "name": "host_etc", "host": { "sourcePath": "/etc" } } ],
コンテナ定義セクションで、先ほど定義したボリュームをマウントするコンテナを作成します。この例では、
web
コンテナがempty
およびhost_etc
ボリュームをマウントします。このコンテナは、Dockerfile 内のボリュームでビルドされたイメージを使用しています。"containerDefinitions": [ { "name": "web", "image": "
my-repo/httpd_dockerfile_volume
", "cpu": 100, "memory": 500, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "mountPoints": [ { "sourceVolume": "empty", "containerPath": "/usr/local/apache2/htdocs/empty_volume" }, { "sourceVolume": "host_etc", "containerPath": "/usr/local/apache2/htdocs/host_etc" } ], "essential": true },volumesFrom
を使用して、web
コンテナに関連付けられているすべてのボリュームをマウントする、別のコンテナを作成します。web
コンテナ上にあるすべてのボリュームは、同様にbusybox
コンテナにもマウントされます。これには、my-repo/httpd_dockerfile_volume
イメージのビルドに使用された Dockerfile で指定されたボリュームも含まれます。{ "name": "busybox", "image": "busybox", "volumesFrom": [ { "sourceContainer": "web" } ], "cpu": 100, "memory": 500, "entryPoint": [ "sh", "-c" ], "command": [ "echo $(date) > /usr/local/apache2/htdocs/empty_volume/date && echo $(date) > /usr/local/apache2/htdocs/host_etc/date && echo $(date) > /usr/local/apache2/htdocs/dockerfile_volume/date" ], "essential": false } ] }
このタスクが実行されると、2 つのコンテナでボリュームがマウントされ、
busybox
コンテナのcommand
がファイルに日付と時刻を書き込みます。このファイルは、各ボリュームフォルダにdate
の名前で保存されています。その後、フォルダはweb
コンテナによって表示されるウェブサイトで見ることができます。注記
busybox
コンテナはクイックコマンドを実行して終了するため、コンテナ定義で"essential": false
として設定する必要があります。そうしなければ、終了時にタスク全体が停止します。