Bind-Mounts - Amazon ECS

Bind-Mounts

Bei Bind-Mounts ist eine Datei oder ein Verzeichnis auf einem Host wie AWS Fargate, in einem Container montiert. Bind-Mounts an den Lebenszyklus des Containers gebunden, indem sie verwendet werden. Nachdem alle Container, die ein Bind-Mount verwenden, gestoppt wurden, z. B. wenn eine Aufgabe gestoppt wird, werden die Daten entfernt. Weitere Informationen finden Sie unter Verwenden von Bind-Mounts in der Docker-Dokumentation.

Die folgenden Szenarien sind gängige Anwendungsfälle für Bind-Mounts.

  • So stellen Sie ein leeres Datenvolume bereit, das in einem oder mehreren Containern bereitgestellt werden soll.

  • Um einen Pfad und seinen Inhalt aus einer Dockerdatei für einen oder mehrere Container verfügbar zu machen.

Überlegungen zur Verwendung von Bind-Mounts

Bei der Verwendung von Bind-Mounts sollte Folgendes berücksichtigt werden.

  • Für Aufgaben, die auf AWS Fargate mit Plattformversion 1.4.0 oder höher (Linux) oder 1.0.0 oder höher (Windows) gehostet werden, erhalten sie standardmäßig mindestens 20 GiB flüchtigen Speicher für Bind-Bindungsbereitstellungen. Die Gesamtmenge des flüchtigen Speichers kann auf maximal 200 GiB erhöht werden, indem das ephemeralStorage-Objekt in Ihrer Aufgabendefinition festgelegt wird.

  • Um Dateien aus einer Dockerdatei auf einem Datenvolume verfügbar zu machen, wenn eine Aufgabe ausgeführt wird, sucht die Amazon ECS-Datenebene nach einer VOLUME-Richtlinie. Wenn der absolute Pfad, der in der VOLUME-Richtlinie angegeben ist der gleiche wie containerPath ist, die in der Aufgabendefinition angegeben sind, werden die Daten im VOLUME-Richtlinienpfad auf das Datenvolume kopiert. Im folgenden Dockerfile-Beispiel wird eine Datei mit dem Namen examplefile im /var/log/exported-Verzeichnis auf den Host geschrieben und dann innerhalb des Containers gemountet.

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

    Standardmäßig sind die Volume-Berechtigungen auf 0755 und der Besitzer als root festgelegt. Sie können diese Berechtigungen in der Dockerfile anpassen. Das folgende Beispiel definiert den Eigentümer des Verzeichnisses als 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"]

Angeben eines Bind-Mounts in Ihrer Aufgabendefinition

Für Amazon-ECS-Aufgaben, die auf Fargate gehostet sind, zeigt der folgende JSON-Ausschnitt die Syntax der volumes-, mountPoints-, und ephemeralStorage-Objekte für eine Aufgabendefinition.

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

Im Folgenden finden Sie weitere detaillierte Beschreibungen der einzelnen Aufgabendefinitionsparameter.

name

Typ: Zeichenfolge

Erforderlich: Nein

Der Name des Volumes. Bis zu 255 Buchstaben (Groß- und Kleinbuchstaben), Ziffern, Bindestriche und Unterstriche sind zulässig. Auf diesen Namen wird im Parameter sourceVolume der Containerdefinition mountPoints verwiesen.

mountPoints

Typ: Objekt-Array

Erforderlich: Nein

Die Mountingpunkte für Daten-Volumes in Ihrem Container.

Dieser Parameter ordnet zu Volumes im Bereich Erstellen eines Containers der Docker Remote API und der Option --volume für die docker run zu.

Windows-Container können ganze Verzeichnisse auf dem gleichen Laufwerk wie $env:ProgramData mounten. Windows-Container können keine Verzeichnisse auf einem anderen Laufwerk mounten, und es ist kein laufwerksübergreifender Mountingpunkt möglich.

sourceVolume

Typ: Zeichenfolge

Erforderlich: Ja, wenn mountPoints verwendet werden

Der Name des zu mountenden Volumes.

containerPath

Typ: Zeichenfolge

Erforderlich: Ja, wenn mountPoints verwendet werden

Der Pfad auf dem Container, auf dem das Volume gemountet werden soll.

readOnly

Typ: Boolesch

Erforderlich: Nein

Wenn dieser Wert true lautet, verfügt der Container über schreibgeschützten Zugriff auf das Volume. Lautet der Wert false, dann verfügt der Container über Schreibzugriff auf das Volume. Der Standardwert ist false.

ephemeralStorage

Typ: Objekt

Erforderlich: Nein

Die Menge des flüchtigen Speichers, der für die Aufgabe zugewiesen werden soll. Dieser Parameter wird verwendet, um die Gesamtmenge des flüchtigen Speichers über den Standardbetrag hinaus für Aufgaben zu erweitern, die auf AWS Fargate unter Verwenden der Plattformversion 1.4.0 oder höher (Linux) oder 1.0.0 oder höher (Windows) gehostet werden.

Sie können die Copilot-CLI, CloudFormation, die AWS-SDK oder die CLI verwenden, um flüchtigen Speicher für ein Bind-Mount anzugeben.

Bind-Mount-Beispiele

In den folgenden Beispielen werden die häufigsten Anwendungsfälle für die Verwendung eines Bind-Mounts für Ihre Container behandelt.

So weisen Sie einer Fargate-Aufgabe einen erhöhten flüchtigen Speicher zu

Für Amazon-ECS-Aufgaben, die auf Fargate mit Plattformversion 1.4.0 oder höher (Linux) oder 1.0.0 (Windows) gehostet werden können Sie mehr als die Standardmenge des flüchtigen Speichers für die zu verwendenden Container in Ihrer Aufgabe zuweisen. Dieses Beispiel kann in die anderen Beispiele integriert werden, um flüchtigen Speicher für Ihre Fargate-Aufgaben zuzuweisen.

  • Definieren Sie in der Aufgabendefinition ein ephemeralStorage-Objekt. sizeInGiB muss eine Ganzzahl zwischen den Werten von 21 und 200 sein und wird in GiB ausgedrückt.

    "ephemeralStorage": { "sizeInGiB": integer }

So stellen Sie ein leeres Datenvolume für einen oder mehrere Container bereit

In einigen Fällen möchten Sie den Containern in einer Aufgabe einen Scratchspace bereitstellen. Möglicherweise besitzen Sie z. B. zwei Datenbank-Container, die während einer Aufgabe auf denselben Scratch-Dateispeicherort zugreifen müssen. Dies kann mit einem Bind-Mount erreicht werden.

  1. Definieren Sie im Abschnitt volumes der Aufgabendefinition ein Bind-Mount mit dem Namen database_scratch.

    "volumes": [ { "name": "database_scratch", } ]
  2. Erstellen Sie im Abschnitt containerDefinitions die Datenbank-Containerdefinitionen, damit sie das Volume mounten.

    "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" } ] } ]

So stellen Sie einen Pfad und seinen Inhalt in einer Dockerdatei einem Container zur Verfügung

In diesem Beispiel haben Sie eine Dockerdatei, die Daten schreibt, die Sie in einem Container mounten möchten.

  1. Erstellen Sie eine Docker-Datei. Im folgenden Beispiel wird das öffentliche Amazon Linux 2-Container-Image verwendet und eine Datei mit dem Namen examplefile im /var/log/exported-Verzeichnis, das wir innerhalb des Containers einhängen möchten. Die VOLUME-Direktive sollte einen absoluten Pfad angeben.

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

    Standardmäßig sind die Volume-Berechtigungen auf 0755 und der Besitzer als root festgelegt. Diese Berechtigungen können in der Dockerdatei geändert werden. Im folgenden Beispiel wird der Besitzer des /var/log/exported-Verzeichnis auf node festgelegt.

    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. Definieren Sie im Abschnitt volumes der Aufgabendefinition ein Volume mit dem Namen application_logs.

    "volumes": [ { "name": "application_logs", } ]
  3. Erstellen Sie im Abschnitt containerDefinitions die Containerdefinitionen der Anwendung, damit sie den Speicher mounten. Der containerPath-Wert muss mit dem absoluten Pfad übereinstimmen, der in der VOLUME-Richtlinie aus der Dockerfile angegeben ist.

    "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" } ] } ]