Especificar dependências no Python
Há duas maneiras de especificar dependências para as funções do Cloud Run escritas
em Python: usando o arquivo requirements.txt
do gerenciador de pacotes pip ou
o empacotamento de dependências locais junto com sua função.
A especificação de dependência que usa o padrão Pipfile/Pipfile.lock não é compatível. Seu projeto não deve incluir esses arquivos.
Como especificar dependências com pip
Dependências no Python são gerenciadas com pip e expressas em um arquivo de metadados chamado requirements.txt
.
O arquivo precisa estar no mesmo diretório que o arquivo main.py
que contém o código da função.
Quando você implanta ou reimplanta a função, as funções do Cloud Run
usam o pip para fazer o download e instalar a versão mais recente das
dependências, conforme declarado no arquivo requirements.txt
.
O arquivo requirements.txt
contém uma linha por pacote. Cada linha contém o nome do pacote e, como opção, a versão solicitada. Para mais detalhes, consulte a referência do requirements.txt
.
Para evitar que seu build seja afetado por mudanças na versão de dependência, fixe os pacotes de dependência em uma versão específica.
A seguir, um exemplo de arquivo requirements.txt
:
functions-framework requests==2.20.0 numpy
O Functions Framework é uma dependência necessária para todas as funções. Embora as funções do Cloud Functions o instalem em seu nome quando a função é criada, recomendamos que você a inclua como uma dependência explícita para maior clareza.
Se a
função depende de dependências particulares, recomendamos que você
espelhe functions-framework
no registro particular. Inclua o functions-framework
espelhado como uma dependência da sua função para evitar a instalação do
pacote pela Internet pública.
Como empacotar dependências locais
Também é possível empacotar e implantar dependências junto com sua função. Essa abordagem é útil se sua dependência não estiver disponível por meio do gerenciador de pacotes pip ou se o acesso à Internet do ambiente das funções do Cloud Run for restrito.
Por exemplo, é possível usar uma estrutura de diretório como a seguinte:
myfunction/ ├── main.py └── localpackage/ ├── __init__.py └── script.py
Você pode importar o código normalmente de localpackage
usando a seguinte instrução import
.
# Code in main.py from localpackage import script
Observe que essa abordagem não executará nenhum arquivo setup.py
. Pacotes com esses
arquivos ainda podem ser agrupados, mas podem não ser executados corretamente nas funções do Cloud Run.
Dependências disponibilizadas por pacotes de terceiros
Dependências disponibilizadas por pacotes de terceiros são aquelas em que a origem é incluída diretamente no pacote de código-fonte e recriada com seu próprio código. Use a variável de ambiente de build GOOGLE_VENDOR_PIP_DEPENDENCIES para criar dependências pip disponibilizadas por pacotes de terceiros e para evitar a instalação delas durante a implantação.
Criar dependências disponibilizadas por pacotes de terceiros
Verifique se python3 está instalado no sistema de desenvolvimento.
Declare as dependências do aplicativo em um arquivo
requirements.txt
no diretório raiz da árvore de desenvolvimento.Declare o Functions Framework como um requisito incluindo
functions-framework
em uma linha separada no arquivorequirements.txt
.Faça o download das dependências da função para o diretório local. As etapas para fazer isso dependem do tipo de arquivo de dependência: um arquivo wheel (*.whl) do Python ou um arquivo tar (*.tar.gz).
Se a dependência for um wheel do Python (*.whl), faça o download dela no diretório raiz da árvore de desenvolvimento com este comando pip:
python3 -m pip download -r requirements.txt --only-binary=:all: \ -d DIRECTORY \ --python-version PYTHON_RUNTIME_VERSION \ --platform manylinux2014_x86_64 \ --implementation cp
Substitua:
- DIRECTORY: o nome do diretório local para o download.
- PYTHON_RUNTIME_VERSION: a versão do Python a ser usada para
verificações de compatibilidade. Por exemplo,
311
para Python 3.11.
Essa versão precisa corresponder a um dos ambientes de execução Python compatíveis
A estrutura de diretórios resultante será semelhante a esta:
myfunction/ ├── main.py └── requirements.txt └── DIRECTORY ├── dependency1.whl └── dependency2.whl
Se a dependência for um arquivo tar (*.tar.gz):
Se a dependência estiver escrita em Python, use o pip para fazer o download dela:
python3 -m pip download -r requirements.txt \ -d DIRECTORY
Se uma dependência consistir em códigos escritos em C ou C++, faça o download dela e a compile separadamente.
Implante a função e as dependências disponibilizadas por pacotes de terceiros:
gcloud functions deploy FUNCTION_NAME \ --runtime PYTHON_RUNTIME_NAME \ --set-build-env-vars GOOGLE_VENDOR_PIP_DEPENDENCIES=DIRECTORY
Substitua:
- FUNCTION_NAME: o nome da função entre as funções do Cloud Run que você está implantando.
- PYTHON_RUNTIME_NAME: o nome de um dos ambientes de execução Python compatíveis para executar a função implantada em, por exemplo, python311. Precisa ser a mesma versão do ambiente de execução do Python usada no ambiente de desenvolvimento local.
- DIRECTORY: o nome do diretório que contém as dependências disponibilizadas por pacotes de terceiros.
Para mais detalhes sobre o uso de buildpacks, consulte Criar uma função com buildpacks.
Como usar dependências privadas
Dependências particulares do Artifact Registry
Um repositório Python do Artifact Registry
pode hospedar dependências particulares para sua função Python. Ao implantar nas funções do Cloud Run,
o processo de compilação gera automaticamente credenciais do Artifact Registry
para a conta de serviço do Cloud Build. Só é preciso incluir o URL do Artifact Registry no requirements.txt
sem gerar outras credenciais. Exemplo:
--index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage
Se o build precisar de vários repositórios, use um repositório virtual do Artifact Registry para controlar com segurança a ordem de pesquisa do pip nos repositórios.
Dependências particulares de outros repositórios
As dependências são instaladas em um ambiente Cloud Build, que não fornece acesso a chaves SSH. Os pacotes hospedados em repositórios que requerem autenticação baseada em SSH precisam ser fornecidos e carregados junto com o código do seu projeto, conforme descrito na seção anterior.
Use o comando pip install
com a sinalização -t DIRECTORY
para copiar dependências privadas em um diretório local antes de implantar o aplicativo, da seguinte maneira:
Copie sua dependência em um diretório local:
pip install -t DIRECTORY DEPENDENCY
Adicione um arquivo
__init__.py
vazio ao diretórioDIRECTORY
para transformá-lo em um módulo.Importe deste módulo para usar sua dependência:
import DIRECTORY.DEPENDENCY
Pacotes pré-instalados
Os seguintes pacotes do Python são instalados automaticamente junto com sua função durante a implantação. Se estiver usando qualquer um desses pacotes no código de função, recomendamos incluir as seguintes versões em seu arquivo requirements.txt
:
Python 3.7
Python 3.8 e posterior
* `pip` (latest version)
* `setuptools` (latest version)
* `wheel` (determined by product requirements)
Além disso, o ambiente de execução do Python inclui vários pacotes do sistema no ambiente de execução. Se a função usar uma dependência que exija um pacote de sistema que não esteja listado, será possível solicitá-lo.