Personalize os contêineres com Databricks Container service
Databricks Container Services permite que o senhor especifique uma imagem Docker ao criar compute. Alguns exemplos de casos de uso incluem:
- Personalização da biblioteca: você tem controle total sobre as bibliotecas do sistema que deseja instalar.
- Ambiente de contêiner dourado: sua imagem do Docker é um ambiente bloqueado que nunca mudará.
- Integração Docker CI/CD: você pode integrar Databricks com seus pipelines Docker CI/CD.
O senhor também pode usar o Docker Image para criar ambientes personalizados de aprendizagem profunda no compute com dispositivos GPU. Para obter informações adicionais sobre o uso da GPU compute com Databricks Container Services, consulte Databricks Container Services na GPU compute.
Para que a tarefa seja executada sempre que o contêiner começar, use um init script.
Requisitos
- Seu Databricks workspace deve ter o Databricks Container Services ativado.
- Sua máquina deve estar rodando um daemon Docker recente (testado e que funcione com a versão Client/Server 18.03.0-ce) e o comando
docker
deve estar disponível em seuPATH
.
Limitações
-
Databricks Container Services não é compatível com o site compute que usa o modo de acesso padrão (antigo modo de acesso compartilhado).
-
Databricks Runtime para Machine Learning não oferece suporte a Databricks Container Services.
-
Para acessar os volumes em Databricks Container Services, adicione a seguinte configuração ao campo compute's Spark config :
spark.databricks.unityCatalog.volumes.enabled true
. -
172.17.0.0/16
é o intervalo de IPs de default usado por Docker. Para evitar problemas de conectividade devido a um conflito de IP, evite configurar um recurso nessa sub-rede. -
O Databricks Container Services não é compatível com os tipos de instância do AWS Graviton.
Etapa 1: construa sua base
A Databricks recomenda que você crie sua base do Docker a partir de uma base que a Databricks construiu e testou. Também é possível construir sua base Docker do zero. Esta seção descreve as duas opções.
Opção 1. Usar uma base construída pela Databricks
Este exemplo usa a tag 9.x
para uma imagem que terá como alvo um compute com a versão de tempo de execução Databricks Runtime 9.1 LTS e acima:
FROM databricksruntime/standard:9.x
...
Para especificar bibliotecas Python adicionais, como a versão mais recente de pandas e urllib, use a versão específica do contêiner de pip
. Para o contêiner databricksruntime/standard:9.x
, inclua o seguinte:
RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3
Para o contêiner databricksruntime/standard:8.x
ou inferior, inclua o seguinte:
RUN /databricks/conda/envs/dcs-minimal/bin/pip install pandas
RUN /databricks/conda/envs/dcs-minimal/bin/pip install urllib3
As imagens de base são hospedadas no Docker Hub em https://hub.docker.com/u/databricksruntime. Os Dockerfiles usados para gerar essas bases estão em https://github.com/databricks/containers.
As imagens hospedadas no Docker Hub com tags com o sufixo “-LTS” serão corrigidas. Todas as outras imagens são exemplos e não são corrigidas regularmente.
As imagens base databricksruntime/standard
e databricksruntime/minimal
não devem ser confundidas com os ambientes databricks-standard
e databricks-minimal
não relacionados incluídos no Databricks Runtime com Conda (Beta) não mais disponível.
Opção 2. Criar sua própria base do Docker
Você também pode criar sua base do Docker do zero. A imagem do Docker deve atender a estes requisitos:
- JDK 8u191 como Java no sistema
PATH
- bash
- iproute2 (ubuntu iproute)
- coreutils (ubuntu coreutils)
- procps (ubuntu procps)
- sudo (ubuntu sudo)
- Ubuntu Linux
Para criar sua própria imagem do zero, você deve criar o ambiente virtual. O senhor também deve incluir pacotes que estão incorporados em Databricks compute, como Python e R. Para começar, use a imagem de base apropriada:
- Para R:
databricksruntime/rbase
- Para Python:
databricksruntime/python
- Para a imagem mínima criada pelo Databricks:
databricksruntime/minimal
Você também pode consultar o exemplo Dockerfiles no GitHub.
A Databricks recomenda o uso do Ubuntu Linux; no entanto, é possível usar o Alpine Linux. Para usar o Alpine Linux, você deve incluir estes arquivos:
Além disso, você deve configurar o Python, conforme mostrado neste Dockerfile de exemplo.
Teste completamente sua imagem de contêiner personalizado em um Databricks compute. Seu contêiner pode funcionar em uma máquina local ou de compilação, mas quando o contêiner é iniciado em Databricks, o lançamento do compute pode falhar, determinados recursos podem ser desativados ou o contêiner pode parar de funcionar, mesmo silenciosamente. Na pior das hipóteses, isso pode corromper seus dados ou expor acidentalmente seus dados a terceiros.
Etapa 2: empurre sua imagem base
Envie sua imagem de base personalizada para um registro do Docker. Este processo é suportado com os seguintes registros:
- Docker Hub sem autenticação ou autenticação básica.
- Amazon Elastic Container Registry (Amazon ECR) com IAM (com exceção dos serviços de nuvem comercial (C2S)).
- Registro de contêiner do Azure com autenticação básica.
Outros registros do Docker que não suportam autenticação ou autenticação básica também devem funcionar.
Se usar Docker Hub para seu registro Docker, verifique se os limites de taxa acomodam a quantidade de compute que o senhor espera lançar em um período de seis horas. Esses limites de taxa são diferentes para usuários anônimos, usuários autenticados sem inscrição paga e inscrição paga. Consulte a documentação do Docker para obter detalhes. Se esse limite for excedido, você receberá uma resposta de “429 solicitações demais”.
Etapa 3: Inicie seu compute
O senhor pode iniciar o compute usando a interface do usuário ou o API.
Inicie seu compute usando a UI.
-
Na página Create compute, especifique uma versão Databricks Runtime compatível com Databricks Container Services.
-
Em Advanced , selecione a opção Docker tab.
-
Selecione Usar seu próprio contêiner do Docker .
-
No campo URL da imagem do Docker , insira sua imagem personalizada do Docker.
Exemplos de URL de imagem do Docker:
Registro
Formato da etiqueta
Docker Hub
<organization>/<repository>:<tag>
(por exemplo:databricksruntime/standard:latest
)Amazon ECR
<aws-account-id>.dkr.ecr.<region>.amazonaws.com/<repository>:<tag>
Registro de contêiner do Azure
<your-registry-name>.azurecr.io/<repository-name>:<tag>
-
Selecione o tipo de autenticação. Você pode usar segredos para armazenar valores de autenticação de nome de usuário e senha. Consulte Docker Autenticação de imagem.
Inicie o site compute usando o API
-
Use o Databricks CLI para iniciar um compute com sua base Docker personalizada.
Bashdatabricks clusters create \
--cluster-name <cluster-name> \
--node-type-id i3.xlarge \
--json '{
"num_workers": 0,
"docker_image": {
"url": "databricksruntime/standard:latest",
"basic_auth": {
"username": "<docker-registry-username>",
"password": "<docker-registry-password>"
}
},
"spark_version": "14.3.x-scala2.12",
"aws_attributes": {
"availability": "ON_DEMAND",
"instance_profile_arn": "arn:aws:iam::<aws-account-number>:instance-profile/<iam-role-name>"
}
}'
Docker Autenticação de imagem
Os requisitos de autenticação dependem do tipo de imagem Docker. Você também pode usar segredos para armazenar nomes de usuário e senhas de autenticação. Consulte Usar segredos para autenticação.
-
Para a imagem pública Docker, o senhor não precisa incluir informações de autenticação. Na interface do usuário, defina Authentication (Autenticação ) como padrão . Para a chamada de API, não inclua os campos
basic_auth
. -
Para a imagem privada Docker, autentique-se usando um ID de entidade de serviço e senha (ou segredos aplicáveis) como nome de usuário e senha.
-
Para o Registro de Contêiner do Azure, autentique-se usando um ID e uma senha da entidade de serviço (ou segredos aplicáveis) como nome de usuário e senha. Consulte a documentação de autenticação da entidade de serviçoAzure Container Registry para obter informações sobre como criar a entidade de serviço.
-
Para imagens ECR, não inclua informações de autenticação. Em vez disso, inicie seu compute com um instance profile que inclua permissões para extrair a imagem Docker do repositório Docker onde a imagem reside. Para fazer isso, siga as etapas 3 e 4 do processo de configuração do acesso seguro aos buckets do S3 usando o perfil da instância.
Aqui está um exemplo de uma função do IAM com permissão para extrair qualquer imagem. O repositório é especificado por
<arn-of-repository>
.JSON{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ecr:GetAuthorizationToken"],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetrepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage"
],
"Resource": ["<arn-of-repository>"]
}
]
}Se a imagem ECR residir em um AWS account diferente do Databricks compute, use uma política de repositório ECR além do compute instance profile para conceder o acesso compute. Aqui está um exemplo de uma política de repositório ECR. O IAM role assumido pelo compute's instance profile é especificado por
<arn-of-IAM-role>
.JSON{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountPush",
"Effect": "Allow",
"Principal": {
"AWS": "<arn-of-IAM-role>"
},
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:DescribeImages",
"ecr:DescribeRepositories",
"ecr:GetDownloadUrlForLayer",
"ecr:GetrepositoryPolicy",
"ecr:ListImages"
]
}
]
}
Use segredos para autenticação
Databricks O serviço de contêiner suporta o uso de segredos para autenticação. Ao criar o recurso compute na interface do usuário, use o campo Authentication (Autenticação ) para selecionar Username (Nome de usuário) e password (Senha) e , em vez de digitar o nome de usuário ou a senha em texto simples, digite os segredos usando o formato {{secrets/<scope-name>/<dcs-secret>}}
. Se o senhor usar a API, insira os segredos nos campos basic_auth
.
Para obter informações sobre como criar segredos, consulte Gerenciamento de segredos.
Use um init script
Databricks Container Services permitir que os clientes incluam o script de inicialização no contêiner Docker. Na maioria dos casos, o senhor deve evitar o script de inicialização e, em vez disso, fazer as personalizações diretamente pelo site Docker (usando o Dockerfile). No entanto, algumas tarefas devem ser executadas quando o contêiner começar, em vez de quando o contêiner for construído. Use um init script para essas tarefas.
Por exemplo, suponha que você queira executar um daemon de segurança dentro de um contêiner personalizado. Instale e crie o daemon na imagem do Docker por meio do pipeline de criação de imagem. Em seguida, adicione um script de inicialização que inicia o daemon. Neste exemplo, o script de inicialização incluiria uma linha como systemctl start my-daemon
.
No site API, o senhor pode especificar o script de inicialização como parte da especificação compute da seguinte forma. Para obter mais informações, consulte o site de clustering API.
"init_scripts": [
{
"file": {
"destination": "file:/my/local/file.sh"
}
}
]
Para imagens Databricks Container Services, o senhor também pode armazenar o script de inicialização no armazenamento em nuvem.
As etapas a seguir ocorrem quando o senhor inicia um compute que usa o Databricks Container Services:
- As VMs são adquiridas do provedor de nuvem.
- A imagem personalizada do Docker é baixada do seu repositório.
- O Databricks cria um contêiner Docker da imagem.
- O código do Databricks Runtime é copiado para o contêiner do Docker.
- O script de inicialização é executado. Consulte O que são scripts de inicialização?
O Databricks ignora as primitivas Docker CMD
e ENTRYPOINT
.
Ativar o serviço Container
Para usar contêineres personalizados no seu compute, um administrador do workspace deve habilitar o Databricks Container Services.
Os administradores do workspace podem ativar o serviço Databricks Container usando o Databricks CLI. Em um corpo de solicitação JSON, especifique enableDcs
a true
, como no exemplo a seguir:
databricks workspace-conf set-status \
--json '{"enableDcs": "true"}'