Traga Seu Próprio Contêiner

Você pode criar e usar um contêiner personalizado (Bring Your Own Container ou BYOC) ao criar um job e execuções de jobs.

O tamanho máximo de uma imagem de contêiner que você pode usar com jobs é de 25 GB. O tamanho da imagem do contêiner diminui o tempo de provisionamento do job por causa da extração do contêiner do Container Registry. Recomendamos que você use as menores imagens de contêiner possíveis.

Para executar o job, crie seu próprio Dockerfile e uma imagem. Você começa com um Dockerfile, que usa a imagem slim do Python. O Dockerfile foi projetado para que você possa criar builds locais e remotos. Você usa o build local ao testar localmente o código. Durante o desenvolvimento local, você não precisa criar uma nova imagem para cada alteração de código.
Observação

Não armazene arquivos no diretório /home/datascience. Quando o contêiner é provisionado e executado como uma execução de job, ele é substituído quando está nesse diretório.

Use a opção remota para executar o Dockerfile quando achar que o código está completo e quiser executá-lo como job, como neste exemplo de Dockerfile:

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

Veja a seguir um exemplo de arquivo 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.")
Dica

Fornecemos vários exemplos para ajudar você a começar.

Para poder enviar e extrair imagens de/ para o Oracle Cloud Infrastructure Registry (também conhecido como Registro de Contêiner), você deve ter um token de autorização do Oracle Cloud Infrastructure. Você só vê a string do token de autenticação quando a cria, portanto, copie o token de autenticação para um local seguro imediatamente.

  1. Para exibir os detalhes: Na barra de navegação, selecione o menu Perfil e, em seguida, selecione Definições do usuário ou Meu perfil, dependendo da opção exibida.
  2. Na página Tokens de Autenticação, selecione Gerar Token.
  3. Digite uma descrição amigável para o token de autenticação. Evite digitar informações confidenciais.
  4. SelecioneGerar Token. O novo token de autenticação será exibido.
  5. Copie o token de autenticação imediatamente para um local seguro em que você poderá recuperá-lo posteriormente. Você não verá o token de autenticação novamente na Console.
  6. Feche a caixa de diálogo Gerar Token.
  7. Abra uma janela de terminal em sua máquina local.
  8. Acesse o Container Registry para que você possa criar, executar, testar, marcar e enviar a imagem do contêiner.
    docker login -u '<tenant-namespace>/<username>' <region>.ocir.io
    OpçãoDescrição
    Executar no local

    Cria o arquivo docker, mas não inclui o código para uma execução rápida, depuração e assim por diante:

    docker build --build-arg type=local -t byoc .
    Executar como um job

    Cria o arquivo docker com o código nele pronto para ser executado como job:

    docker build --build-arg type=remote -t byoc .
    OpçãoDescrição
    Teste local com a localização do código montada

    A chave de autorização da API para o diretório de usuário do home do docker ./oci está montada. Se você usar outro usuário na imagem do docker, altere o caminho /home/datascience/.oci. Por exemplo, se você usar uma conta raiz, altere o caminho para /root/.oci.

    docker run --rm -v $HOME/.oci:/home/datascience/.oci -v $PWD:/app byoc python /app/job_logs.py
    
    O teste local com o código está no contêiner

    Mesmo quando o contêiner é criado usando a opção remote para armazenar o código na imagem, para uma execução local, o token de autenticação da API do OCI ainda é necessário.

    docker run --rm -v $HOME/.oci:/home/datascience/.oci -v $PWD:/app byoc
  9. Informe e procure o código do contêiner
    docker run -it byoc sh
    ls
    exit
  10. Marque sua imagem de contêiner local:
    docker login -u '<tenant-namespace>/<username>' <region>.ocir.io
    docker tag byoc:latest<region>.ocir.io/<tenancy-name>/byoc:1.0
  11. Envie sua imagem de contêiner:
    docker push <region>.ocir.io/<tenancy>/byoc:1.0
  12. Certifique-se de que os jobs tenham uma política para o controlador de recursos para permitir que ele leia o OCIR do compartimento no qual você armazenou a imagem.
    allow dynamic-group {<your-dynamic-group-name>} to read repos in compartment {<your-compartment-name>}
  13. (Opcional) Assine a imagem do contêiner. Isso só será necessário se você estiver usando a verificação de assinatura de imagem.
  14. (Opcional) Certifique-se de que os jobs tenham uma política para o controlador de recursos para permitir que ele use o serviço vault do compartimento no qual as chaves de vault da assinatura da imagem são armazenadas. A política é necessária apenas para verificação de assinatura de imagem.
    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. Selecione uma das seguintes opções para criar um job:
    • BYOC versão 2: Crie um job usando o pop-up da janela de configuração do Ambiente. Consulte a etapa 9 em Criando um Job.
    • BYOC versão 1: Crie um job usando a variável de ambiente de job, apontando para o local da imagem do contêiner no OCIR para executá-lo como job:
      CONTAINER_CUSTOM_IMAGE=iad.ocir.io/mytenancyname/byoc:1.0
      Observação

      O BYOC versão 1 agora está obsoleto e não é o método recomendado.