Bring Your Own Container

Puoi creare e utilizzare un contenitore personalizzato (Bring Your Own Container o BYOC) da utilizzare quando crei un job e le esecuzioni di job.

La dimensione massima di un'immagine contenitore che è possibile utilizzare con i job è di 25 GB. La dimensione dell'immagine del contenitore rallenta il tempo di provisioning per il job a causa dell'estrazione del contenitore dal Container Registry. Si consiglia di utilizzare le immagini del contenitore più piccole possibili.

Per eseguire il job, è necessario creare il proprio Dockerfile e creare un'immagine. Si inizia con un file Dockerfile che utilizza l'immagine sottile Python. Dockerfile è progettato per consentire la creazione di build locali e remote. La build locale viene utilizzata quando si esegue il test a livello locale rispetto al codice. Durante lo sviluppo locale, non è necessario creare una nuova immagine per ogni modifica del codice.
Nota

Non memorizzare i file nella directory /home/datascience. Quando viene eseguito il provisioning e l'esecuzione del contenitore come esecuzione job, viene eseguito l'override quando si trova in questa directory.

Utilizzare l'opzione remota per eseguire il comando Dockerfile quando si ritiene che il codice sia completo e si desidera eseguirlo come job, come nell'esempio Dockerfile riportato di seguito.

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

Di seguito è riportato un file job_logs.py di esempio:

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.")
Suggerimento

Abbiamo fornito diversi esempi per aiutarti a iniziare.

Prima di poter eseguire il push e il pull delle immagini in e da Oracle Cloud Infrastructure Registry (noto anche come Container Registry), è necessario disporre di un token di autorizzazione per Oracle Cloud Infrastructure. La stringa del token di autenticazione viene visualizzata solo quando viene creata, quindi assicurarsi di copiare immediatamente il token di autenticazione in una posizione sicura.

  1. Per visualizzare i dettagli: nella barra di navigazione, selezionare il menu Profilo, quindi selezionare Impostazioni utente o Profilo personale, a seconda dell'opzione visualizzata.
  2. Nella pagina Token di autenticazione selezionare Genera token.
  3. Immettere una descrizione descrittiva per il token di autenticazione. Evitare di fornire informazioni riservate.
  4. Selezionare Genera token. Viene visualizzato il nuovo token di autenticazione.
  5. Copiare immediatamente il token di autenticazione in una posizione sicura in cui è possibile recuperarlo in un secondo momento. Il token di autenticazione non verrà più visualizzato nella console.
  6. Chiudere la finestra di dialogo Genera token.
  7. Aprire una finestra di terminale sul computer locale.
  8. Accedi a Container Registry in modo da poter creare, eseguire, testare, etichettare e inviare l'immagine del contenitore.
    docker login -u '<tenant-namespace>/<username>' <region>.ocir.io
    Opzionedescrizione;
    Esegui localmente

    Genera il file docker, ma non include il codice per un'esecuzione rapida, il debug e così via:

    docker build --build-arg type=local -t byoc .
    Esegui come job

    Genera il file docker con il codice in esso pronto per essere eseguito come job:

    docker build --build-arg type=remote -t byoc .
    Opzionedescrizione;
    Test locale con la posizione del codice attivata

    La chiave di autorizzazione API per la directory utente della home del docker ./oci è stata attivata. Se si utilizza un utente diverso nell'immagine docker, è necessario modificare il percorso /home/datascience/.oci. Ad esempio, se si utilizza un account root, il percorso viene modificato in /root/.oci.

    docker run --rm -v $HOME/.oci:/home/datascience/.oci -v $PWD:/app byoc python /app/job_logs.py
    
    Il test locale con il codice è nel contenitore

    Anche quando il contenitore viene creato utilizzando l'opzione remote per memorizzare il codice nell'immagine, per un'esecuzione locale è ancora necessario il token di autenticazione API OCI.

    docker run --rm -v $HOME/.oci:/home/datascience/.oci -v $PWD:/app byoc
  9. Immettere e sfogliare il codice del contenitore
    docker run -it byoc sh
    ls
    exit
  10. Contrassegna l'immagine del contenitore locale:
    docker login -u '<tenant-namespace>/<username>' <region>.ocir.io
    docker tag byoc:latest<region>.ocir.io/<tenancy-name>/byoc:1.0
  11. Inserisci l'immagine del container:
    docker push <region>.ocir.io/<tenancy>/byoc:1.0
  12. Assicurarsi che i job dispongano di un criterio che consenta al principal della risorsa di leggere l'OCIR dal compartimento in cui è stata memorizzata l'immagine.
    allow dynamic-group {<your-dynamic-group-name>} to read repos in compartment {<your-compartment-name>}
  13. (Facoltativo) Firma l'immagine del contenitore. Questa operazione è necessaria solo se si utilizza la verifica della firma dell'immagine.
  14. (Facoltativo) Assicurarsi che i job dispongano di un criterio per il principal risorsa che gli consenta di utilizzare il servizio vault dal compartimento in cui sono memorizzate le chiavi vault per la firma dell'immagine. Il criterio è necessario solo per la verifica della firma dell'immagine.
    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. Selezionare una delle seguenti opzioni per creare un job:
    • BYOC versione 2: creare un job utilizzando la finestra popup di configurazione dell'ambiente. Vedere il passo 9 in Creazione di un job.
    • BYOC versione 1: creare un job utilizzando la variabile di ambiente del job, indicando la posizione dell'immagine del contenitore nell'OCIR per eseguirla come job:
      CONTAINER_CUSTOM_IMAGE=iad.ocir.io/mytenancyname/byoc:1.0
      Nota

      BYOC versione 1 non è più valido e non è il metodo consigliato.