Referenz der Dienstspezifikation¶
Die Spezifikation der Snowpark Container Services befindet sich in YAML (https://yaml.org/spec/). Sie gibt Snowflake die notwendigen Informationen, um Ihren Dienst oder Job zu konfigurieren und auszuführen.
Die allgemeine Syntax ist wie folgt:
spec:
containers: # container list
- name: <name>
image: <image-name>
command: # optional list of strings
- <cmd>
- <arg1>
args: # optional list of strings
- <arg2>
- <arg3>
- ...
env: # optional
<key>: <value>
<key>: <value>
...
readinessProbe: # optional
port: <TCP port-num>
path: <http-path>
volumeMounts: # optional list
- name: <volume-name>
mountPath: <mount-path>
- name: <volume-name>
...
resources: # optional
requests:
memory: <memory-reserved>
nvidia.com/gpu: <count>
cpu: <cpu-units>
limits:
memory: <memory-reserved>
nvidia.com/gpu: <count>
cpu: <cpu-units>
secrets: # optional list
- snowflakeSecret:
secretKeyRef:
envVarName: # specify this or directoryPath
directoryPath: # specify this or envVarName
endpoints: # optional endpoint list
- name: <name>
port: <TCP port-num>
public: <true / false>
protocol : < TCP / HTTP / HTTPS >
- name: <name>
...
volumes: # optional volume list
- name: <name>
source: local | @<stagename> | memory
size: <amount-of-memory> # specify if memory is the volume source
- name: <name>
source: local | @<stagename> | memory
size: <amount-of-memory> # specify if memory is the volume source
...
logExporters:
eventTableConfig:
logLevel: <INFO | ERROR | NONE>
Allgemeine Richtlinien¶
Eine Dienst-/Jobspezifikation hat auf oberster Ebene die folgenden spec
-Felder:
spec.containers
(erforderlich): Eine Liste von einem oder mehreren Anwendungscontainern. Ihre containerisierte Anwendung muss mindestens einen Container haben.spec.endpoints
(optional): Eine Liste der Endpunkte, die der Dienst öffentlich bereitstellt. Sie können einen öffentlichen Endpunkt wählen, der den Netzwerkzugang (Eingehende Daten) zum Dienst ermöglicht.spec.volumes
(optional): Eine Liste von Speichervolumes, die von den Containern verwendet werden sollen.spec.logExporters
(optional): Dieses Feld verwaltet die Ebene der Containerprotokolle, die in die Ereignistabelle Ihres Kontos exportiert werden.
Für die name
-Felder (Container-, Endpunkt- und Volume-Namen) gelten die folgenden Formatrichtlinien:
Kann bis zu 63 Zeichen lang sein
Kann eine Sequenz von alphanumerischen Kleinbuchstaben oder „-“-Zeichen enthalten
Muss mit einem alphabetischen Zeichen beginnen
Muss mit einem alphanumerischen Zeichen enden
Achtung
Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten in die Spezifikationsdatei eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.
In den folgenden Abschnitten werden die einzelnen spec
-Felder der obersten Ebene erläutert.
Feld spec.containers
(erforderlich)¶
Das Feld containers
enthält eine Liste der OCI-Container in Ihrer Anwendung. Für jeden Container sind nur die Felder name
und image
Pflichtfelder. Das Feld image
bezieht sich auf den Namen des Images, das Sie in ein Snowflake-Image-Repository Ihres Snowflake-Kontos hochgeladen haben. Beispiel:
spec:
containers:
- name: echo
image: /tutorial_db/data_schema/tutorial_repository/echo_service:dev
Wenn Sie einen Dienst (oder einen Job) erstellen, führt Snowflake diese Container auf einem Einzelknoten im angegebenen Computepool aus, der dieselbe Netzwerkschnittstelle nutzt. Sie können mehrere Dienstinstanzen ausführen; in diesem Fall wird jeder Satz dieser Container als Dienstinstanz bezeichnet.
Bemerkung
Snowpark Container Services erfordert derzeit Images der linux/amd64-Plattform.
In den folgenden Abschnitten werden die Typen von containers
-Feldern erläutert.
Felder containers.command
und containers.args
¶
Verwenden Sie diese optionalen Felder, um den Einstiegspunkt des Containers (den Befehl, den der Container zusammen mit allen Parametern ausführt) zu überschreiben, der in Dockerfile
(Teil Ihres Anwendungsimages) definiert ist, ohne dass Sie Ihr Anwendungsimage neu erstellen müssen:
containers.command
übersteuert denENTRYPOINT
vonDockerfile
. Auf diese Weise können Sie eine andere ausführbare Datei in dem Container ausführen.containers.args
übersteuert denCMD
vonDockerfile
. Auf diese Weise können Sie dem Befehl (der ausführbaren Datei) verschiedene Argumente bereitstellen.
Beispiel
Ihre Dockerfile
-Datei enthält den folgenden Code:
ENTRYPOINT ["python3", "main.py"]
CMD ["Bob"]
Diese Dockerfile
-Einträge führen den python3
-Befehl aus und übergeben zwei Argumente: main.py
und Bob
. Sie können diese Werte in der Spezifikationsdatei wie folgt überschreiben:
Um ENTRYPOINT zu überschreiben, fügen Sie das Feld
containers.command
in die Spezifikationsdatei ein:spec: containers: - name: echo image: <image_name> command: - python3.9 - main.py
Um das Argument „Bob“ zu überschreiben, fügen Sie das Feld
containers.args
in die Spezifikationsdatei ein:spec: containers: - name: echo image: <image_name> args: - Alice
Feld containers.env
¶
Verwenden Sie das Feld containers.env
, um Umgebungsvariablen anzugeben, die an alle Prozesse in Ihrem Container übergegeben werden:
spec:
containers:
- name: <name>
image: <image_name>
env:
ENV_VARIABLE_1: <value1>
ENV_VARIABLE_2: <value2>
…
…
Beispiel
In Tutorial 1 liest der Anwendungscode (echo_service.py
) die Umgebungsvariablen mit Standardwerten, wenn der Wert nicht explizit gesetzt ist.
CHARACTER_NAME = os.getenv('CHARACTER_NAME', 'I')
SERVER_PORT = os.getenv('SERVER_PORT', 8080)
CHARACTER_NAME
: Wenn der Echo-Dienst eine HTTP POST-Anforderung mit einer Zeichenfolge (z. B. „Hallo“) empfängt, gibt der Dienst „I said Hello“ (Ich sagte Hallo) zurück. Sie können diesen Standardwert in der Spezifikationsdatei überschreiben. Wenn Sie beispielsweise den Wert auf „Bob“ setzen, gibt der Echo-Dienst die Antwort „Bob said Hello“ (Bob sagte Hallo) zurück.SERVER_PORT
: In dieser Standardkonfiguration überwacht der Echo-Dienst Port 8080. Sie können den Standardwert überschreiben und einen anderen Port angeben.
Die folgende Spezifikationsdatei übersteuert diese beiden Umgebungsvariablenwerte:
spec:
containers:
- name: echo
image: <image_name>
env:
CHARACTER_NAME: Bob
SERVER_PORT: 8085
endpoints:
- name: echo-endpoint
port: 8085
Sie müssen aber Folgendes beachten: Da Sie die Portnummer, den Ihr Dienst überwacht, geändert haben, hat die Spezifikation auch den Endpunkt (Feldwert endpoints.port
) aktualisiert.
Feld containers.readinessProbe
¶
Verwenden Sie das containers.readinessProbe
-Objekt, um Snowflake einen Bereitschaftstest in Ihrer Anwendung bereitzustellen. Snowflake ruft diesen Test auf, um festzustellen, ob Ihre Anwendung bereit ist, Anforderungen zu bedienen.
Snowflake stellt eine HTTP-GET-Anforderung an den angegebenen Bereitschaftstest mit dem angegebenen Port und Pfad und wartet darauf, dass Ihr Dienst einen HTTP 200-OK-Status zurückgibt, um sicherzustellen, dass nur funktionstüchtige Container den Datenverkehr bedienen.
Verwenden Sie die folgenden Felder, um die erforderlichen Informationen anzugeben:
port
: Der Netzwerkport, den der Dienst auf Anforderungen des Bereitschaftstests hin überwacht. Dieser Port muss nicht als Endpunkt deklariert sein.path
: Snowflake stellt HTTP-GET-Anforderungen an den Dienst mit diesem Pfad.
Beispiel
In Tutorial 1 implementiert der Anwendungscode (echo_python.py
) den folgenden Bereitschaftstest:
@app.get("/healthcheck")
def readiness_probe():
Dementsprechend enthält die Spezifikationsdatei das Feld containers.readinessProbe
:
spec:
containers:
- name: echo
image: <image_name>
env:
SERVER_PORT: 8088
CHARACTER_NAME: Bob
readinessProbe:
port: 8088
path: /healthcheck
endpoints:
- name: echo-endpoint
port: 8088
Der vom Bereitschaftstest angegebene Port muss kein konfigurierter Endpunkt sein. Ihr Dienst könnte einen anderen Port nur für den Zweck des Bereitschaftstests überwachen.
Feld containers.volumeMounts
¶
Da die Felder spec.volumes
und spec.containers.volumeMounts
zusammenarbeiten, werden sie zusammen in einem Abschnitt erläutert. Weitere Informationen dazu finden Sie unter Feld spec.volumes (optional).
Feld containers.resources
¶
Snowflake legt fest, wie die verfügbaren Computepool-Ressourcen zur Ausführung Ihrer Anwendung verwendet werden sollen. Es wird empfohlen, die Ressourcenanforderungen für Ihre Dienstinstanzen ausdrücklich anzugeben und in der Spezifikation entsprechende Limits festzulegen. Beachten Sie, dass die von Ihnen angegebenen Ressourcen durch die Instanz-Familie der Knoten in Ihrem Computepool eingeschränkt sind. Weitere Informationen dazu finden Sie unter CREATE COMPUTE POOL.
Snowflake stellt sicher, dass die durch containers.resources.requests
spezifizierten Ressourcen bereitgestellt werden und verhindert außerdem, dass der Dienst mehr als die in containers.resources.limits
angegebenen Limits verwendet. Sie können Anforderungen und Grenzen für die folgenden Ressourcen festlegen:
memory
: Dies ist der für Ihren Anwendungscontainer benötigte Arbeitsspeicher. Für die Angabe der Werte kann eine dezimale oder eine binäre Einheit verwendet werden. Beispielsweise steht „2G“ für eine Anforderung von 2.000.000.000 Bytes. Weitere Informationen dazu finden Sie unter Allgemeine Informationen zu Maßeinheiten.cpu
: Dies bezieht sich auf virtuelle Verarbeitungseinheiten (vCPU). Beispielsweise ist die 1 CPU-Einheit gleichbedeutend mit 1 vCPU. Erlaubt sind auch Anforderungen von Bruchteilen, wie „0.5“, die auch als „500m“ ausgedrückt werden können. Weitere Informationen dazu finden Sie unter Allgemeine Informationen zu Maßeinheiten.nvidia.com/gpu
: Wenn GPUs erforderlich sind, müssen diese angefordert werden, und es muss auch einlimit
-Wert für dieselbe Menge angegeben werden. Wenn Ihr Container keine Anforderungen und Limits für die GPU-Kapazität angibt, ist kein Zugriff auf GPUs möglich. Die Anzahl der GPUs, die Sie anfordern können, ist durch die maximale Anzahl von GPUs begrenzt, die von dem Instanz-Typ inINSTANCE_TYPE
unterstützt wird, den Sie beim Erstellen eines Computepools auswählen. Weitere Informationen dazu finden Sie unter CREATE COMPUTE POOL.
Wenn Snowflake die Ressourcen, die explizit in der Spezifikationsdatei enthalten sind, nicht zuweisen kann, können Sie die Dienste zwar erstellen (mit CREATE SERVICE), aber der Dienststatus zeigt an, dass der Dienst aufgrund unzureichender Ressourcen nicht geplant werden kann.
Beispiel 1
In der folgenden Spezifikation beschreibt das Feld containers.resources
die Ressourcenanforderungen für den Container:
spec:
containers:
- name: resource-test-gpu
image: ...
resources:
requests:
memory: 2G
cpu: 0.5
nvidia.com/gpu: 1
limits:
memory: 4G
nvidia.com/gpu: 1
In diesem Beispiel wird Snowflake aufgefordert, dem Container mindestens 2 GB Arbeitsspeicher, eine GPU und einen halben CPU-Kern zuzuweisen. Gleichzeitig darf der Container nicht mehr als 4 GB Arbeitsspeicher und eine GPU verwenden.
Beispiel 2
Sie erstellen einen Computepool mit zwei Knoten, wobei jeder Knoten 16 GB Arbeitsspeicher und eine GPU hat:
CREATE COMPUTE POOL tutorial_compute_pool MIN_NODES = 2 MAX_NODES = 2 INSTANCE_FAMILY = gpu_nv_s
Sie erstellen einen Dienst, der Snowflake auffordert, zwei Instanzen des Dienstes auszuführen:
CREATE SERVICE echo_service MIN_INSTANCES=2 MAX_INSTANCES=2 IN COMPUTE POOL tutorial_compute_pool FROM @<stage_path> SPEC=<spec-file-stage-path>;
Sowohl
MIN_INSTANCES
als auchMAX_INSTANCES
werden auf 2 gesetzt. Daher wird Snowflake zwei Instanzen des Dienstes ausführen.
Wenn Sie die Ressourcenanforderungen nicht explizit in Ihre Anwendungsspezifikation aufnehmen, entscheidet Snowflake, ob diese Instanzen auf demselben Knoten oder auf verschiedenen Knoten im Computepool ausgeführt werden sollen.
Sie geben den Ressourcenbedarf an und fordern 10 GB Arbeitsspeicher für den Container:
- name: resource-test image: ... resources: requests: memory: 10G
Ihr Computepool-Knoten verfügt über 16 GB Arbeitsspeicher, wobei Snowflake nicht zwei Container auf demselben Knoten ausführen kann. Snowflake führt die beiden Dienstinstanzen auf separaten Knoten im Computepool aus.
Die Anforderung für den Container ist 1 GB Arbeitsspeicher und eine GPU:
spec: containers: - name: resource-test-gpu image: ... resources: requests: memory: 2G nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1
Sie fordern eine GPU pro Container an, und jeder Knoten hat nur eine GPU. In diesem Fall kann Snowflake nicht beide Dienste auf einem Knoten einplanen, obwohl der Arbeitsspeicher kein Problem darstellt. Diese Anforderung zwingt Snowflake dazu, die beiden Dienstinstanzen auf zwei separaten Computepool-Knoten auszuführen.
Feld containers.secrets
¶
secrets: # optional list
- snowflakeSecret:
secretKeyRef:
envVarName: # specify this or directoryPath
directoryPath: # specify this or envVarName
Verwenden Sie containers.secrets
, um Snowflake Geheimnisobjekte zu übergeben, die der Container zum Authentifizieren verwenden kann, wenn ein Dienst oder Job mit externen Endpunkten (außerhalb von Snowflake) kommuniziert. Weitere Informationen dazu finden Sie unter Verwenden von Snowflake-Geheimnissen zur Übergabe von Anmeldeinformationen an einen Container.
snowflakeSecret
(erforderlich): Name eines Geheimnisobjekts von Snowflake.secretKeyRef
: Der Name des Schlüssels im Geheimnis. Wenn dieses Feld angegeben wird, übergibt Snowflake den mit dieser Schlüsselreferenz verbundenen Wert an den Container. Erforderlich für grundlegende Authentifizierungsgeheimnisse, die als Umgebungsvariablen eingebunden sind. Sie geben dieses Feld nur an, wenn Sie Geheimnisse an Umgebungsvariablen in Containern übergeben.envVarName
: Der Name der Umgebungsvariablen, die das Geheimnis enthält. Entweder dieses oder das FelddirectoryPath
ist erforderlich.directoryPath
: Der Verzeichnispfad im Container, in den die Geheimnisse kopiert werden sollen. Snowflake füllt eine Datei für jeden Geheimnisschlüssel in diesem angegebenen Verzeichnis. Wenn SiedirectoryPath
angeben, geben Sie nichtsecretKeyRef
an. Entweder dieses oder das FeldenvVarName
ist erforderlich.
Weitere Informationen dazu finden Sie unter Übergeben von Snowflake-Geheimnissen an einen Container.
Feld spec.endpoints
(optional)¶
Verwenden Sie das Feld spec.endpoints
, um eine Liste von Namen für die TCP-Netzwerkports anzugeben, die Ihre Anwendung öffentlich bereitstellt. Snowpark Container Services können null bis viele Endpunkte bereitstellen. Verwenden Sie die folgenden Felder, um einen Endpunkt zu beschreiben:
name
: Eindeutiger Name des Endpunkts. Wenn Sie sich in einer Dienstfunktion auf den Endpunkt beziehen, geben Sie diesen Namen an.port
: Der Netzwerkport, den Ihre Anwendung auf Anforderungen hin überwacht.protocol
: Das Protokoll, das der Endpunkt unterstützt. Folgende Werte werden unterstützt: TCP, HTTP und HTTPS. Das Standardprotokoll ist HTTP. Das Protokoll muss HTTP oder HTTPS sein, wenn dieser Endpunkt öffentlich oder das Ziel einer Dienstfunktion ist (siehe Verwenden eines Dienstes).public
: Wenn dieser Endpunkt über das Internet zugänglich sein soll, setzen Sie dieses Feld auftrue
.
Bemerkung
Snowflake führt für den öffentlichen Zugriff Authentifizierungs- und Autorisierungsprüfungen durch, die nur Snowflake-Benutzern mit entsprechender Berechtigung die Verwendung des Dienstes ermöglichen.
Beispiel
Im Folgenden finden Sie die Anwendungsspezifikation, die in Tutorial 1 verwendet wird:
spec:
container:
- name: echo
image: <image-name>
env:
SERVER_PORT: 8000
CHARACTER_NAME: Bob
readinessProbe:
port: 8000
path: /healthcheck
endpoint:
- name: echoendpoint
port: 8000
public: true
Dieser Anwendungscontainer stellt einen Endpunkt öffentlich zur Verfügung. Der Container enthält auch das optionale Feld public
, um den Zugriff auf den Endpunkt von außerhalb von Snowflake (Internetzugang) zu ermöglichen. Standardmäßig ist public
auf false
eingestellt.
Feld spec.volumes
(optional)¶
Dieser Abschnitt erklärt die beiden Felder spec.volumes
und spec.containers.volumeMounts
. volumes
definiert ein freigegebenes Dateisystem. Der Wert von volumeMount
definiert, wo ein Volume in einem Container erscheint. Mehrere Container können das gleiche Volume gemeinsam nutzen. Daher ist volumes
ein Feld auf spec
-Ebene, und volumeMount
ist Teil einer Container-Spezifikation.
Verwenden Sie diese Felder, um sowohl die Volumes als auch die Volumebereitstellungen zu beschreiben.
Verwenden Sie
spec.volumes
, um die für Ihre Container verfügbaren Volumes anzugeben.volumes
ist eine Liste. Das heißt, es kann mehrere Volumes geben. Verwenden Sie die folgenden Felder, um ein Volume zu beschreiben:name
: Eindeutiger Name des Volumes. Er wird mitspec.containers.volumeMounts.name
bezeichnet.source
: Dies kannlocal
,memory
oder"@<stagename>"
sein.uid
: Bei einem Snowflake-Stagingbereichs-Volume ist dies die „uid“ der eingebundenen Datei.gid
: Bei einem Snowflake-Stagingbereichs-Volume ist dies die „gid“ der eingebundenen Datei.size
: Bei einem Arbeitsspeicher-Volume ist dies die Größe des Volumes.
Verwenden Sie
spec.containers.volumeMounts
, um anzugeben, wo die angegebenen Volumes im Dateisystem des Containers eingebunden sind.containers.volumeMounts
ist ebenfalls eine Liste. Das heißt, jeder Container kann mehrere Volume-Bereitstellungen haben. Verwenden Sie die folgenden Felder, um eine Volume-Bereitstellung zu beschreiben:name
: Der Name des einzubindenden Volumes. Ein einzelner Container kann mehrfach auf dasselbe Volume verweisen.mountPath
: Der Dateipfad, unter dem das Volume für den Container eingebunden werden soll.
Snowflake unterstützt die folgenden Volume-Typen für Anwendungscontainer: lokale Volumes, Arbeitsspeicher und Snowflake-Stagingbereich.
Lokales Volume: Container in einer Dienstinstanz können einen lokalen Datenträger zur Freigabe von Dateien verwenden. Wenn Ihre Anwendung beispielsweise aus zwei Containern besteht – einem Anwendungscontainer und einem Protokollanalysator – kann die Anwendung Protokolle in das lokale Volume schreiben, und der Protokollanalysator kann die Protokolle lesen.
Wenn Sie mehrere Instanzen eines Dienstes ausführen, müssen Sie beachten, dass nur Container, die zu einer Dienstinstanz gehören, Volumes gemeinsam nutzen können. Container, die zu verschiedenen Dienstinstanzen gehören, können Volumes nicht gemeinsam verwenden.
Arbeitsspeicher: Sie können ein RAM-gestütztes Dateisystem für die Verwendung im Container verwenden.
Snowflake-Stagingbereich: Sie können einen Snowflake-Stagingbereich erstellen und damit Containern schnellen Zugriff auf bereitgestellte Stagingdateien geben. Für das Einbinden eines Snowflake-Stagingbereichs gelten die folgenden Bedingungen:
Externe Stagingbereiche werden nicht unterstützt. Es werden nur interne Snowflake-Stagingbereiche mit SSE-Verschlüsselung (siehe Interne Stagingbereichsparameter) unterstützt. Verwenden Sie CREATE STAGE, um einen solchen Stagingbereich zu erstellen:
CREATE STAGE my_stage ENCRYPTION = (type = 'SNOWFLAKE_SSE');
Sie können einen Stagingbereich, z. B.
@my_stage
, oder ein Unterverzeichnis in einem Stagingbereich, z. B.@my_stage/folder
, einbinden. Sie können aber keine Datei in einem Stagingbereich, z. B.@my_stage/folder/file
, einbinden.Die Dienstrolle bestimmt die Berechtigungen, die Containern für den Zugriff auf einen eingebundenen Stagingbereich erteilt werden. Die Dienstrolle ist die Rolle, mit der der Dienst oder Job erstellt wird. Es ist auch die Rolle, die von Dienst oder Job für alle Snowflake-Interaktionen verwendet.
Wenn die Dienstrolle beispielsweise nicht über die WRITE-Berechtigung für einen Stagingbereich verfügt, ist die Einbindung dieses Stagingbereichs schreibgeschützt. Das heißt, die Container können die Dateien nur aus dem Stagingbereich lesen. Wenn die Dienstrolle die WRITE-Berechtigung für einen Stagingbereich hat, unterstützt die Einbindung dieses Stagingbereich sowohl das Lesen als auch das Schreiben. Snowflake lädt Dateiaktualisierungen asynchron hoch.
Ein Container, der einen Snowflake-Stagingbereich einbindet, wird normalerweise als Root-Benutzer ausgeführt. Es kann jedoch vorkommen, dass Ihr Container als Nicht-Root-Benutzer ausgeführt wird. Beispiel:
Wenn Ihre Anwendung eine Drittanbieter-Bibliothek verwendet, benutzt die Bibliothek einen Nicht-Root-Benutzer, um den Anwendungscode innerhalb des Containers auszuführen.
Sie können Ihre Anwendung auch aus anderen Gründen, z. B. aus Sicherheitsgründen, als Nicht-Root-Benutzer innerhalb des Containers ausführen.
Um mögliche Fehler im Zusammenhang mit den Dateibenutzerrechten zu vermeiden, ist es wichtig, die UID (Benutzer-ID) und die GID (Gruppen-ID) des Containers als Teil der Spezifikation festzulegen. Dies ist besonders wichtig für Container, die einen bestimmten Benutzer und eine bestimmte Gruppe zum Starten oder Ausführen der Anwendung innerhalb des Containers verwenden. Durch Festlegen der entsprechenden UID und GID können Sie einen Container verwenden, der als ein Nicht-Root-Benutzer ausgeführt wird. Beispiel:
spec: ... volumes: - name: stagemount source: "@test" uid: <UID-value> gid: <GID-value>
Snowflake verwendet diese Informationen, um den Stagingbereich mit den entsprechenden Berechtigungen einzubinden.
So erhalten Sie die UID und GID des Containers:
Führen Sie den Container lokal mit
docker run
aus.Suchen Sie die Container-ID mit dem Befehl
docker container list
. Hier ist ein Ausschnitt einer Beispielausgabe:CONTAINER ID IMAGE COMMAND —---------------------------------------------------------- a6a1f1fe204d tutorial-image "/usr/local/bin/entr…"
Führen Sie den Befehl
docker id
innerhalb des Containers aus, um die Werte von UID und GID zu erhalten:docker exec -it <container-id> id
Beispielausgabe:
uid=0(root) gid=0(root) groups=0(root)
Beispiel
Ihre Anwendung für maschinelles Lernen umfasst die folgenden zwei Container:
Container
app
für die HauptanwendungContainer
logger-agent
, der Protokolleinträge sammelt und sie zu Amazon S3 hochlädt
Diese Container verwenden die folgenden zwei Volumes:
Volume
local
: Diese Anwendung schreibt Protokolleinträge, die der Logger-Agent liest.Snowflake-Stagingbereich
@model_stage
: Die Hauptanwendung liest Dateien aus diesem Stagingbereich.
In der folgenden Beispielspezifikation bindet der Container app
sowohl das Volume logs
als auch das Volume models
ein, und der Container logging-agent
bindet nur das Volume logs
ein:
spec: containers: - name: app image: <image1-name> volumeMounts: - name: logs mountPath: /opt/app/logs - name: models mountPath: /opt/models - name: logging-agent image: <image2-name> volumeMounts: - name: logs mountPath: /opt/logs volumes: - name: logs source: local - name: models source: "@model_stage"
Wenn mehrere Instanzen des Dienstes ausgeführt werden, verwenden die Container logging-agent
und app
innerhalb einer Dienstinstanz das Volume logs
gemeinsam. Das Volume logs
ist nicht für mehrere Dienstinstanzen freigegeben.
Wenn Ihr app
-Container zusätzlich zu diesen Volumes auch ein 2-GB-Arbeitsspeicher-Volume verwendet, überarbeiten Sie die Spezifikation, um das Volume in die volumes
-Liste aufzunehmen, und fügen Sie außerdem eine weitere Volume-Bereitstellung in die volumeMounts
-Liste des app
-Containers ein:
spec: containers: - name: app image: <image1-name> volumeMounts: - name: logs mountPath: /opt/app/logs - name: models mountPath: /opt/models - name: my-mem-volume mountPath: /dev/shm - name: logging-agent image: <image2-name> volumeMounts: - name: logs mountPath: /opt/logs volumes: - name: logs source: local - name: models source: "@model_stage" - name: "my-mem-volume" source: memory size: 2G
Wenn Sie memory
als Volume source
angeben, müssen Sie auch das Feld volumes.size
spezifizieren, um die Größe des Arbeitsspeichers anzugeben. Weitere Informationen zu den Größeneinheiten für Arbeitsspeicher, die Sie verwenden können, finden Sie unter Allgemeine Informationen zu Maßeinheiten.
Feld spec.logExporters
(optional)¶
Verwenden Sie spec.logExporters
, um zu konfigurieren, wie Snowflake Ihre Anwendungsprotokolle erfasst. Snowflake erfasst die Ausgaben des Codes Ihres Anwendungscontainers, die an die Standardausgabe oder den Standardfehler gehen.
Snowflake exportiert diese Protokolleinträge in eine Ereignistabelle in Ihrem Konto. Weitere Informationen dazu finden Sie unter Zugriff auf lokale Containerprotokolle. Geben Sie mit spec.logExporters.eventTableConfig
an, welche Protokolle in der Ereignistabelle gespeichert werden sollen:
logExporters:
eventTableConfig:
logLevel: < INFO | ERROR | NONE >
Folgende logLevel
-Werte werden unterstützt:
INFO
: Alle Benutzerprotokolleinträge exportieren.ERROR
: Nur Fehlerprotokolleinträge exportieren. Snowflake exportiert nur die Protokolle aus dem „stderr“-Stream.NONE
(Standard): Es werden keine Protokolleinträge in die Ereignistabelle exportiert.
Allgemeine Informationen zu Maßeinheiten¶
Eine Dienstspezifikation enthält an mehreren Stellen numerische Werte. Snowpark Container Services unterstützt eine Vielzahl von Einheiten, um diese Werte auszudrücken. Für große und kleine Werte können Sie, wie gezeigt, binäre und dezimale Maßeinheiten verwenden. In der folgenden Liste steht „#“ für einen Ganzzahlwert (Integer).
Binäreinheiten:
numberKi
bedeutetnumber*1024
. Beispielsweise istmemory: 4Ki
äquivalent zumemory: 4096
.numberMi
bedeutetnumber*1024^2
.numberGi
bedeutetnumber*1024^3
.
Dezimaleinheiten:
numberk
bedeutetnumber*10^3
. Beispielsweise istmemory: 4k
äquivalent zumemory: 4000
.numberM
bedeutetnumber*10^6
.numberG
bedeutenumber*10^9
.
Bruchteileinheiten:
numberm
bedeutetnumber*0.001
. Beispielsweise istcpu: 500m
äquivalent zucpu: 0.5
.