Criar funções em contêineres

O Cloud Run permite implantar funções diretamente. No entanto, também é possível criar uma função em uma imagem de contêiner usando os buildpacks do Google Cloud e depois implantar essa imagem de contêiner no Cloud Run.

Casos de uso comuns para criar funções em contêineres:

  • Integração e entrega contínuas: os desenvolvedores criam e enviam o código da função para um repositório de origem. Um sistema de CI/CD cria automaticamente a função em um contêiner, executa testes e a implanta automaticamente em um ambiente de preparo.
  • Infraestrutura como código: os recursos do Cloud Run gerenciados com YAML ou Terraform fazem referência a um URL de imagem de contêiner. O código da função escrito pelos desenvolvedores precisa ser criado em uma imagem de contêiner.

Nesta página, detalhamos como replicar o processo de build exato das funções do Cloud Run usando duas maneiras:

  • Como usar a CLI pack
  • Usar o Cloud Build como o sistema de build remoto

Ponto de entrada da função

Para criar funções com buildpacks:

  • Inclua a biblioteca Functions Framework.

  • Defina a variável de ambiente GOOGLE_FUNCTION_TARGET como o nome da função usada como ponto de entrada. Você pode fazer isso incluindo um project.toml na mesma pasta que o código-fonte. O arquivo project.toml precisa ter a seguinte configuração:

[[build.env]]
    name = "GOOGLE_FUNCTION_TARGET"
    value =  "ENTRY_POINT"

Substitua ENTRY_POINT pelo método da função.

Para mais detalhes sobre como usar variáveis de ambiente com funções do Cloud Run, consulte Configure os serviços de funções do Cloud Run.

Builders

As funções do Cloud Run são criadas com base em imagens de base mantidas e publicadas nos buildpacks do Google Cloud.

Os builders são imagens que consistem em buildpacks e pacotes do sistema operacional (também conhecidos como stacks). Os builders são usados para converter o código-fonte da função em um contêiner em execução.

É possível escolher na lista de builders de buildpacks do Google Cloud com suporte.

Como criar com pack

Pacote é uma ferramenta de CLI mantida pelo projeto CNB para dar suporte ao uso de buildpacks. Use a CLI pack para criar suas funções localmente em uma imagem de contêiner.

Antes de começar

  1. Instale o Docker Community Edition (CE) na estação de trabalho. O Docker é usado pela pack como um builder de imagens OCI.
  2. Instale a CLI Pack.
  3. Instale a ferramenta de controle de origem Git para buscar a amostra de aplicativo do GitHub.

Criar uma função localmente

Use o comando pack build e especifique o builder padrão --builder=gcr.io/buildpacks/builder para criar as imagens de contêiner localmente.

pack build --builder=gcr.io/buildpacks/builder IMAGE_NAME

Substitua IMAGE_NAME pelo nome da sua imagem de contêiner.

Também é possível personalizar a imagem de contêiner estendendo as imagens de build e execução.

Criar uma função de amostra localmente

Os exemplos a seguir demonstram como criar uma amostra localmente.

  1. Clone o repositório de amostra na máquina local:
    git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
  2. Altere para o diretório que contém o exemplo de código do aplicativo:

    Go

    cd buildpack-samples/sample-functions-framework-go

    Java

    cd buildpack-samples/sample-functions-framework-java-mvn

    Node.js

    cd buildpack-samples/sample-functions-framework-node

    Python

    cd buildpack-samples/sample-functions-framework-python

    Ruby

    cd buildpack-samples/sample-functions-framework-ruby
  3. Use pack para criar a função de amostra:

    Go

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-go

    Java

    pack build --builder gcr.io/buildpacks/builder:v1 sample-functions-java-mvn

    Node.js

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-node

    Python

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-python

    Ruby

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-ruby
  4. Execute a imagem usando docker:

    Go

    docker run -p8080:8080 sample-functions-framework-go

    Java

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-java-mvn

    Node.js

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-node

    Python

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-python

    Ruby

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-ruby
  5. Acesse a função em execução pelo localhost:8080.

Como criar com um sistema de build remoto

Use o Cloud Build para criar a função em uma imagem de contêiner e o Artifact Registry como repositório de contêineres para armazenar e implantar cada imagem.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build and Artifact Registry APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Build and Artifact Registry APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. Verifique se o projeto Google Cloud tem acesso a um repositório de imagens de contêiner.

    Para configurar o acesso a um repositório do Docker no Artifact Registry:

    1. Crie um novo repositório do Docker no mesmo local do seu projeto Google Cloud .
      gcloud artifacts repositories create REPO_NAME \
      --repository-format=docker \
      --location=REGION --description="DESCRIPTION"
      Substitua:
      • REPO_NAME pelo nome que você escolheu para o repositório do Docker.
      • REGION pelo local dentro ou mais próximo do local do seu projeto do Google Cloud .
      • DESCRIPTION com uma descrição da sua escolha.

      Por exemplo, para criar um repositório docker em us-west2 com a descrição "repositório do Docker", execute:

      gcloud artifacts repositories create buildpacks-docker-repo --repository-format=docker \
      --location=us-west2 --description="Docker repository"
    2. Verifique se o repositório foi criado:
      gcloud artifacts repositories list

      Na lista, você verá o nome que escolheu para o repositório do Docker.

  15. Criar uma função remotamente

    Use o comando gcloud builds submit para criar e fazer upload da imagem do contêiner para o repositório.

    Especifique a imagem do contêiner no próprio comando ou use um arquivo de configuração.

    Criar com o comando

    Para criar sem um arquivo de configuração, especifique a flag image:

    gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME

    Substitua:

    • LOCATION pelo nome da região do repositório de contêineres, por exemplo, us-west2
    • PROJECT_ID com o ID do seu Google Cloud projeto.
    • REPO_NAME pelo nome do repositório do Docker.
    • IMAGE_NAME pelo nome da imagem do contêiner.

    Exemplo:

    gcloud builds submit --pack image=us-west2-docker.pkg.dev/my-project-id/my-buildpacks-docker-repo

    Criar com arquivos de configuração

    Use um arquivo de configuração para definir os detalhes de configuração do repositório de imagens como simplesmente o comando de build. O arquivo de configuração usa o formato YAML e precisa incluir uma etapa de build que usa a CLI pack.

    1. Crie um nome de arquivo YAML cloudbuild.yaml que inclua o URI do repositório de imagens do contêiner.
      options:
        logging: CLOUD_LOGGING_ONLY
        pool: {}
      projectId: PROJECT_ID
      steps:
      - name: gcr.io/k8s-skaffold/pack
        entrypoint: pack
        args:
        - build
        - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
        - --builder
        - gcr.io/buildpacks/builder:latest
        - --network
        - cloudbuild
      images:
      - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME

    Substitua:

    • LOCATION pelo nome da região do repositório de contêineres, por exemplo, us-west2.
    • PROJECT_ID com o ID do seu Google Cloud projeto.
    • REPO_NAME pelo nome do repositório do Docker.
    • IMAGE_NAME pelo nome da imagem do contêiner.
    1. Crie o aplicativo.

      Se você nomeou seu arquivo de configuração cloudbuild.yaml, execute o seguinte comando:

      gcloud builds submit .
      

    Exemplo: criar uma função de exemplo remotamente

    Os exemplos a seguir demonstram como criar uma amostra remotamente e, em seguida, verificar se a imagem de contêiner foi enviada para o repositório no Artifact Registry.

    1. Clone o repositório de amostra na máquina local:
      git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
    2. Altere para o diretório que contém o exemplo de código do aplicativo:

      Go

      cd buildpack-samples/sample-functions-framework-go

      Java

      cd buildpack-samples/sample-functions-framework-java-mvn

      Node.js

      cd buildpack-samples/sample-functions-framework-node

      Python

      cd buildpack-samples/sample-functions-framework-python

      Ruby

      cd buildpack-samples/sample-functions-framework-ruby
    3. Use gcloud para enviar o código-fonte do aplicativo para o Cloud Build:

      Go

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-go

      Java

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-gradle

      Node.js

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-node

      Python

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-python

      Ruby

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-ruby

      Substitua:

      • LOCATION pelo nome da região do repositório de contêineres. Exemplo: us-west2-docker.pkg.dev
      • PROJECT_ID com o ID do seu Google Cloud projeto.
      • REPO_NAME pelo nome do repositório do Docker.

    4. Verifique se a função de amostra foi publicada em REPO_NAME:
      gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME

      Substitua:

      • LOCATION pelo nome da região do repositório de contêineres, por exemplo, us-west2.
      • PROJECT_ID com o ID do seu Google Cloud projeto.
      • REPO_NAME pelo nome do repositório do Docker.

    Como criar uma função para atualizações automáticas de imagem de base

    Os contêineres de função também podem ser criados em scratch, permitindo que sejam usados em combinação com as atualizações automáticas de segurança do Cloud Run.

    Dockerfile

    Você pode usar o conjunto de ferramentas de build atual para criar uma imagem de contêiner de função compatível com atualizações automáticas de imagem de base. Confira instruções sobre como criar um contêiner do zero.

    CLI pack

    pack build IMAGE_NAME \
      --builder LOCATION-docker.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest
      --run-image LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest
    

    Substitua:

    • LOCATION pelo nome da região do repositório de contêineres, por exemplo, us-west2.
    • IMAGE_NAME pelo nome da imagem do contêiner.
    • LANGUAGE com a linguagem da função, por exemplo, nodejs.
    • RUNTIME_ID com o ID do ambiente de execução, por exemplo, nodejs22.

    Cloud Build

    options:
      logging: CLOUD_LOGGING_ONLY
      pool: {}
    projectId: PROJECT_ID
    steps:
    - name: gcr.io/k8s-skaffold/pack
      entrypoint: pack
      args:
      - build
      - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
      - --builder
      - LOCATION-docker.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest
      - --run-image
      - LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest
      - --network
      - cloudbuild
    images:
    - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
    

    Substitua:

    • LOCATION pelo nome da região do repositório de contêineres, por exemplo, us-west2.
    • PROJECT_ID com o ID do seu Google Cloud projeto.
    • REPO_NAME pelo nome do repositório do Docker.
    • IMAGE_NAME pelo nome da imagem do contêiner.
    • LANGUAGE com a linguagem da função, por exemplo, nodejs.
    • RUNTIME_ID com o ID do ambiente de execução, por exemplo, nodejs22.

    A seguir