Bring Your Own Container

Sie können einen benutzerdefinierten Container (Bring Your Own Container oder BYOC) für die Erstellung von Jobs und Jobläufen erstellen und verwenden.

Die maximale Größe eines Containerimages, das Sie mit Jobs verwenden können, beträgt 25 GB. Die Größe des Containerimages verlangsamt die Provisioning-Zeit für den Job, da der Container aus der Container Registry abgerufen wird. Wir empfehlen Ihnen, möglichst kleinste Containerbilder zu verwenden.

Um den Job auszuführen, müssen Sie eine eigene Dockerfile und ein Image erstellen. Sie beginnen mit einer Dockerfile, die das Python-Slimimage verwendet. Die Dockerfile ist so konzipiert, dass Sie lokale und Remote-Builds durchführen können. Sie verwenden den lokalen Build für lokale Tests mit dem Code. Bei der lokalen Entwicklung müssen Sie kein neues Image für jede Codeänderung erstellen.
Hinweis

Speichern Sie keine Dateien im Verzeichnis /home/datascience. Wenn der Container bereitgestellt wird und als Joblauf ausgeführt wird, werden sie in diesem Verzeichnis überschrieben.

Verwenden Sie die Remoteoption, um die Dockerfile auszuführen, wenn der Code abgeschlossen ist und Sie ihn als Job ausführen möchten, wie in diesem Dockerfile-Beispiel:

ARG type

FROM python:3.8-slim AS base

ENV DATASCIENCE_USER datascience
ENV DATASCIENCE_UID 1000
ENV HOME /home/$DATASCIENCE_USER

RUN python -m pip install \
        parse \
        oci


FROM base AS run-type-local
# nothing to see here

FROM base AS run-type-remote
COPY job_logs.py .
CMD ["python", "job_logs.py"]

FROM run-type-${type} AS final

Im Folgenden finden Sie eine Beispieldatei job_logs.py:

import oci
import datetime
import os
import time
import sys
import uuid
from oci.loggingingestion import LoggingClient
from oci.loggingingestion.models import PutLogsDetails, LogEntryBatch, LogEntry

OCI_RESOURCE_PRINCIPAL_VERSION = "OCI_RESOURCE_PRINCIPAL_VERSION"
JOB_RUN_OCID_KEY = "JOB_RUN_OCID"

# switch
class Job:
    def __init__(self):
        rp_version = os.environ.get(OCI_RESOURCE_PRINCIPAL_VERSION, "UNDEFINED")
        if not rp_version or rp_version == "UNDEFINED":
            # RUN LOCAL TEST
            self.signer = oci.config.from_file("~/.oci/config", "BIGDATA")
        else:
            # RUN AS JOB
            self.signer = oci.auth.signers.get_resource_principals_signer()


job = Job()

print(
    "Start logging for job run: {}".format(
        os.environ.get(JOB_RUN_OCID_KEY, "LOCAL")
    )
)
print("Current timestamp in UTC: {}".format(str(datetime.datetime.utcnow())))

print("Delay 5s")

time.sleep(5)

print("... another stdout")

print("Print all environment variables and values")

for item, value in os.environ.items():
    print("{}: {}".format(item, value))

print("Docker Job Done.")
Tipp

Wir haben mehrere Beispiele für den Einstieg bereitgestellt.

Bevor Sie Images an Oracle Cloud Infrastructure Registry (auch als Container Registry bezeichnet) übergeben und von dort abrufen können, benötigen Sie ein Oracle Cloud Infrastructure-Autorisierungstoken. Die Zeichenfolge des Authentisierungstokens wird nur bei der Erstellung angezeigt. Kopieren Sie das Authentifizierungstoken daher sofort an einen sicheren Speicherort.

  1. So zeigen Sie die Details an: Wählen Sie in der Navigationsleiste das Menü Profil aus, und wählen Sie je nach der angezeigten Option Benutzereinstellungen oder Mein Profil.
  2. Wählen Sie auf der Seite Authentifizierungstoken die Option Token generieren aus.
  3. Geben Sie eine benutzerfreundliche Beschreibung für das Token ein. Vermeiden Sie die Eingabe von vertraulichen Informationen.
  4. Wählen Sie Token generieren aus. Das neue Authentifizierungstoken wird angezeigt.
  5. Kopieren Sie das Authentifizierungstoken sofort in einen sicheren Speicherort, an dem Sie es später abrufen können. Das Authentifizierungstoken wird nicht mehr in der Konsole angezeigt.
  6. Schließen Sie das Dialogfeld Token generieren.
  7. Öffnen Sie ein Terminalfenster auf dem lokalen Rechner.
  8. Melden Sie sich bei der Container Registry an, damit Sie das Containerimage erstellen, ausführen, testen, taggen und übertragen können.
    docker login -u '<tenant-namespace>/<username>' <region>.ocir.io
    OptionBeschreibung
    Lokal ausführen

    Erstellt die Docker-Datei, enthält aber nicht den Code für eine Schnellausführung, Debugging usw.:

    docker build --build-arg type=local -t byoc .
    Als Job ausführen

    Erstellt die Docker-Datei mit dem Code, der als Job ausgeführt werden kann:

    docker build --build-arg type=remote -t byoc .
    OptionBeschreibung
    Lokale Tests mit dem bereitgestellten Code-Speicherort

    Der API-Autorisierungsschlüssel für das Docker-Home-Benutzerverzeichnis ./oci ist gemountet. Wenn Sie einen anderen Benutzer im Dockerimage verwenden, müssen Sie den Pfad /home/datascience/.oci ändern. Beispiel: Wenn Sie ein Root-Konto verwenden, ändern Sie den Pfad in /root/.oci.

    docker run --rm -v $HOME/.oci:/home/datascience/.oci -v $PWD:/app byoc python /app/job_logs.py
    
    Lokale Tests mit dem Code befinden sich im Container

    Selbst wenn der Container mit der Option remote erstellt wird, um den Code im Image zu speichern, ist für eine lokale Ausführung das OCI-API-Authentifizierungstoken weiterhin erforderlich.

    docker run --rm -v $HOME/.oci:/home/datascience/.oci -v $PWD:/app byoc
  9. Container-Code eingeben und durchsuchen
    docker run -it byoc sh
    ls
    exit
  10. Taggen Sie das lokale Containerimage:
    docker login -u '<tenant-namespace>/<username>' <region>.ocir.io
    docker tag byoc:latest<region>.ocir.io/<tenancy-name>/byoc:1.0
  11. Übertragen Sie das Containerimage per Push:
    docker push <region>.ocir.io/<tenancy>/byoc:1.0
  12. Stellen Sie sicher, dass Jobs über eine Policy für den Resource Principal verfügen, damit er die OCIR aus dem Compartment lesen kann, in dem Sie das Image gespeichert haben.
    allow dynamic-group {<your-dynamic-group-name>} to read repos in compartment {<your-compartment-name>}
  13. (Optional) Signieren Sie das Containerimage. Dies ist nur erforderlich, wenn Sie die Bildsignaturverifizierung verwenden.
  14. (Optional) Stellen Sie sicher, dass Jobs über eine Policy für den Resource Principal verfügen, damit er den Vault-Service aus dem Compartment verwenden kann, in dem die Vault-Schlüssel für die Imagesignatur gespeichert sind. Die Policy ist nur zur Verifizierung der Imagesignatur erforderlich.
    Allow dynamic-group <dynamic-group-name> to use vaults in compartment <compartment-name>
    Allow dynamic-group <dynamic-group-name> to use keys in compartment <compartment-name>
    Allow dynamic-group <dynamic-group-name> to use secret-family in compartment <compartment-name>
  15. Wählen Sie eine der folgenden Optionen, um einen Job zu erstellen:
    • BYOC-Version 2: Erstellen Sie einen Job mit dem Popup-Fenster "Umgebungskonfiguration". Siehe Schritt 9 in Job erstellen.
    • BYOC-Version 1: Erstellen Sie einen Job mit der Jobumgebungsvariablen, der auf den Speicherort des Containerimages in OCIR verweist, um ihn als Job auszuführen:
      CONTAINER_CUSTOM_IMAGE=iad.ocir.io/mytenancyname/byoc:1.0
      Hinweis

      BYOC-Version 1 ist jetzt veraltet und nicht die empfohlene Methode.