Problemas ao implantar aplicativos e funções
Descubra como solucionar problemas ao implantar aplicativos e funções com o OCI Functions.
Você pode encontrar esses problemas ao implantar aplicativos e funções com o OCI Functions.
A implantação de um aplicativo retorna uma mensagem "unauthorized: incorrect username or password"
Ao implantar uma aplicação, talvez você veja uma mensagem semelhante a esta:
$ fn -v deploy --app acme-app
Deploying go-app to app: acme-app
Bumped to version 0.0.2
Building image phx.ocir.io/ansh81vru1zp/acme-repo/go-app:0.0.2
FN_REGISTRY: phx.ocir.io/ansh81vru1zp/acme-repo
Current Context: acme-functions-compartment
Sending build context to Docker daemon 5.12kB
Step 1/10 : FROM fnproject/go:dev as build-stage
Get https://registry-1.docker.io/v2/fnproject/go/manifests/dev: unauthorized: incorrect username or password
A mensagem indica uma tentativa desnecessária e malsucedida de acessar o Docker Hub. Para resolver essa situação, saia do Docker usando o seguinte comando:
docker logout
Após sair do Docker, execute novamente o comando para implantar o aplicativo.
A implantação de uma função retorna uma mensagem "erro ao executar o envio do docker. Você está conectado ao docker?"
Se você vir uma mensagem semelhante à seguinte ao implantar uma função, verifique cuidadosamente se o seu ambiente de desenvolvimento não tem a variável de ambiente do FN_REGISTRY definida como seu nome de usuário do Docker:
The push refers to repository [docker.io. ...
.
.
.
denied: requested access to the resource is denied
Fn: error running docker push, are you logged into docker?: exit status 1
See fn <command> --help’ for more information.
Se você tiver usado a plataforma do Fn Project de código aberto, talvez tenha seguido as instruções na documentação do Fn Project para definir a variável de ambiente FN_REGISTRY para seu nome de usuário do Docker, a fim de permitir a interação com o registro do Docker oficial (docker.io).
A variável de ambiente FN_REGISTRY substitui o valor da opção de registro em seu contexto da CLI do Fn Project.
Para usar a CLI do Fn Project com o OCI Functions, faça o seguinte:
- Cancele a definição da variável de ambiente FN_REGISTRY.
- Substitua a variável de ambiente FN_REGISTRY usando a opção global
--registry
sempre que você informar um comando da CLI do Fn Project que interaja com o Oracle Cloud Infrastructure Registry.
A implantação de uma função retorna uma mensagem ListTriggers e um erro 500
Ao implantar uma função criada anteriormente usando uma versão anterior da CLI do Fn Project, você pode ver uma mensagem semelhante a esta:
Fn: [GET /triggers][500] ListTriggers default &{Fields: Message:Internal server error}
Essa mensagem indica que o arquivo func.yaml da função contém uma ou mais definições de acionador HTTP. O OCI Functions atualmente não suporta acionadores HTTP. Para implantar a função, remova a seção triggers:
do arquivo func.yaml.
Para evitar a criação de novos arquivos func.yaml contendo definições de acionadores, siga as instruções contidas em Instalando a CLI do Fn Project para fazer upgrade da CLI do Fn Project para a versão mais recente.
A implantação de uma função retorna uma mensagem "Image does not exist or you do not have access to use it"
Ao implantar uma função usando uma instância de computação do Oracle Cloud Infrastructure como seu ambiente de desenvolvimento do OCI Functions, você poderá ver uma mensagem semelhante à seguinte:
Fn: Image phx.ocir.io/ansh81vru1zp/acme-repo/helloworld-func:0.0.2 does not exist or you do not have access to use it.
Essa mensagem indica que a instância de computação não tem acesso ao Oracle Cloud Infrastructure Registry.
Verifique cuidadosamente se existe uma instrução de política (semelhante à seguinte) no compartimento-raiz da tenancy para permitir que um grupo dinâmico que inclua o OCID da instância de computação acesse o Oracle Cloud Infrastructure Registry:
Allow dynamic-group <dynamic-group-name> to read repos in tenancy
Para obter mais informações sobre o uso de uma instância de computação do Oracle Cloud Infrastructure como seu ambiente de desenvolvimento, consulte Diferentes Opções para Ambientes de Desenvolvimento de Funções.
A implantação de uma função no OCI Functions retorna a mensagem "Fn: Missing subnets notes"
Ao implantar uma função no OCI Functions, você pode ver a seguinte mensagem:
$ fn deploy --app joes-helloworld-app
Deploying helloworld-func to app: joes-helloworld-app
.
.
.
Fn: Missing subnets annotation
Se você vir a mensagem Fn: Missing subnets annotation
, confirme que informou o nome correto do aplicativo. Por exemplo:
- o aplicativo pode não estar no compartimento atualmente especificado pelo contexto da CLI do Fn Project
- o aplicativo pode ter existido anteriormente, mas foi excluído subsequentemente
A implantação de uma função no OCI Functions retorna a mensagem "A arquitetura de imagem da função 'x86' é incompatível..."
Ao implantar uma função no OCI Functions, você pode ver uma mensagem semelhante à seguinte:
$ fn deploy --app joes-helloworld-app
Deploying helloworld-func to app: joes-helloworld-app
.
.
.
Fn: Service error:InvalidParameter. Invalid Invalid image - Function's image architecture 'x86' is incompatible with the application's shape type 'GENERIC_X86_ARM'. http status code: 400. Opc request id:...
Esta mensagem indica que a imagem da função não inclui as dependências necessárias (imagens filhas) para a forma do aplicativo. Uma causa provável da mensagem é o uso da CLI do Fn Project versão 0.6.24 (ou anterior) para implantar uma função com uma imagem x86 para:
- um aplicativo que tem uma forma de várias arquiteturas (como Generic_X86_ARM)
- um aplicativo que tem uma única forma de arquitetura que não é compatível com uma imagem x86 (como Generic_ARM)
A partir da CLI do Fn Project versão 0.6.25, quando você usa o comando fn deploy --app <app-name>
para criar uma função e implantá-la no OCI Functions, a CLI do Fn Project cria a imagem do Docker da função com as dependências necessárias para a forma do aplicativo. Se o aplicativo tiver uma forma de várias arquiteturas (como Generic_X86_ARM, a forma de aplicativo padrão desde setembro de 2023), a CLI do Fn Project criará uma imagem de várias arquiteturas para a função. A imagem da função e a forma do aplicativo são sempre compatíveis.
No entanto, a CLI do Fn Project versão 0.6.24 (e anterior) sempre cria imagens do Docker com as dependências necessárias para uma única arquitetura, a arquitetura x86. Como uma única imagem de arquitetura, essa imagem x86 só é compatível com aplicativos que têm a forma de arquitetura única Generic_X86. A imagem x86 é incompatível com aplicativos que têm:
- uma forma de várias arquiteturas (como Generic_X86_ARM, a forma de aplicativo padrão desde setembro de 2023)
- uma única forma de arquitetura que não seja Generic_X86 (como Generic_ARM)
Para implantar a função com sucesso, você precisa fornecer uma imagem compatível com a forma do aplicativo. Execute um dos seguintes procedimentos:
- Use a CLI do Fn Project versão 0.6.25 ou posterior (recomendado).
- Implante a função em outro aplicativo que tenha uma forma compatível com a imagem da função (crie um novo aplicativo, se necessário). Supondo que você esteja usando a CLI do Fn Project versão 0.6.24 ou anterior, sempre implante a função em um aplicativo que tenha uma forma Generic_X86.
- Use o Docker para criar uma imagem compatível com a forma de arquitetura do aplicativo.
Para obter mais informações, consulte Especificando a Arquitetura de Computação na Qual Executar Funções.
A implantação de uma função no OCI Functions no Cloud Shell retorna "OL8 O Cloud Shell não suporta compilações cruzadas e builds de funções multi-arch..." mensagem
Ao implantar uma função no OCI Functions no ambiente de desenvolvimento do Cloud Shell, você poderá ver uma mensagem semelhante à seguinte:
OL8 CloudShell does not support cross-compilation and multi-arch functions builds. Please ensure the architecture of your App matches the CloudShell architecture.
Essa mensagem indica que a função é baseada em uma imagem de várias arquiteturas, ou que o aplicativo tem uma forma de várias arquiteturas, ou que a sessão do Cloud Shell e o aplicativo têm uma arquitetura diferente.
No ambiente de desenvolvimento do Cloud Shell, o OCI Functions não suporta a criação e a implantação de funções com base em imagens de várias arquiteturas, nem aplicativos com formas de várias arquiteturas. Além disso, a arquitetura da sessão do Cloud Shell deve ser a mesma da arquitetura do aplicativo.
Para obter mais informações:
- Sobre a criação de uma função com base em uma imagem de arquitetura única, em um aplicativo que tenha uma forma de arquitetura única compatível, consulte Especificando a Arquitetura de Computação na Qual Executar Funções.
- Sobre a seleção da arquitetura da sessão do Cloud Shell, consulte Arquitetura do Cloud Shell.
A implantação de uma função retorna um "Manifesto de imagem inválido ou não suportado. Não é possível obter a arquitetura da mensagem Manifesto/Cabeçalhos do OCIR..."
Ao implantar uma função no OCI Functions, você pode ver uma mensagem semelhante à seguinte:
$ fn -v deploy --app acme-app
Fn: Service error:InvalidParameter. Invalid or unsupported image manifest. Unable to get architecture from the OCIR Manifest/Headers. http status code: 400.
Existem várias causas e soluções possíveis, conforme descrito nesta seção.
Causa possível: versão incorreta do Docker
A versão do Docker que você está usando pode não ser suportada.
Se você estiver usando o Docker para criar imagens de função, deverá usar uma versão suportada do Docker (no momento da gravação, versão 17.10 ou posterior).
Para confirmar a versão do Docker que você está usando, digite:
docker version
Se a versão do Docker não for suportada, instale uma versão mais recente. Para obter mais informações, consulte Instalando o Docker para Uso com o OCI Functions.
Possível causa: O manifesto está formatado incorretamente ou está sem as informações necessárias
O manifesto da imagem pode estar formatado incorretamente ou pode não conter todas as informações necessárias. A mensagem de erro fornece detalhes adicionais.
Especificamente, o manifesto da imagem:
- Deve estar no formato JSON válido.
- Deve incluir uma compilação de imagem.
- Especifique uma arquitetura de imagem válida (
amd64
,arm64
ou ambos).
Para inspecionar o manifesto da imagem, digite:
docker manifest inspect --verbose <image-path>
Por exemplo:
docker manifest inspect --verbose phx.ocir.io/ansh81vru1zp/acme-repo/acme-func:0.0.3
Verifique se o manifesto da imagem:
- Está no formato JSON válido.
- Inclui um campo
digest
. - Inclui um campo
platform
que especifica uma arquitetura de imagem válida. No caso de uma única imagem de arquitetura, o campoplatform
deve especificaramd64
ouarm64
. No caso de uma imagem com várias arquiteturas, o campoplatform
deve especificaramd64
earm64
. Para obter mais informações, consulte Especificando a Arquitetura de Computação na Qual Executar Funções.
Se o manifesto da imagem estiver formatado incorretamente ou estiver faltando as informações necessárias, atualize o manifesto e recrie a imagem.
Possível causa: Imagem inválida
A imagem criada a partir do manifesto de imagem pode ser inválida (por exemplo, porque falta informações necessárias no manifesto de imagem).
Nesta situação, você tem que reconstruir a imagem. Como reconstruir a imagem depende se você está reconstruindo uma única imagem de arquitetura ou uma imagem de várias arquiteturas e da ferramenta que deseja usar.
Reconstruindo uma única imagem de arquitetura:
Você pode reconstruir imagens de arquitetura única de diferentes maneiras, incluindo:
- Usando a CLI do Fn Project (Recomendado):
No diretório da função, informe o seguinte comando da CLI do Fn Project para construir a função e suas dependências como uma única imagem de arquitetura, submeter a imagem ao registro do Docker especificado e implantar a função no OCI Functions:
fn deploy --app <your-function-app>
em que
<app-name>
é o nome do aplicativo com a forma de arquitetura única, na qual você deseja criar a função.Para obter mais informações, consulte Usando a CLI do Fn Project para criar uma única imagem de arquitetura.
- Usando o comando build do Docker ou o plug-in buildx do Docker:
Para criar uma imagem para a mesma arquitetura da sua plataforma atual, use o comando
docker build
. Por exemplo, para criar uma imagem a ser implantada em um aplicativo comamd64
como a forma de arquitetura única, informe:docker build --platform linux/amd64 -t <image-path> .
Para criar uma imagem para uma arquitetura diferente da sua plataforma atual, use o comando
docker buildx build
. Por exemplo, para criar uma imagem a ser implantada em um aplicativo comamd64
como a forma de arquitetura única, informe:docker buildx build --platform linux/amd64 -t <image-path> .
Certifique-se de especificar
amd64
ouarm64
e não especificar ambos. Certifique-se também de não especificar nenhuma outra arquitetura.Após criar a imagem, digite o seguinte comando para enviar a imagem para o registro do Docker:
docker push <image-path>
Para obter mais informações, consulte Usando o comando de build do Docker para criar uma única imagem de arquitetura.
Reconstruindo uma imagem de várias arquiteturas:
Você pode reconstruir imagens de várias arquiteturas de diferentes maneiras, incluindo:
- Usando a CLI do Fn Project (Recomendado):
No diretório da função, informe o seguinte comando da CLI do Fn Project para construir a função e suas dependências como uma imagem de várias arquiteturas, submeter a imagem ao registro do Docker especificado e implantar a função no OCI Functions:
fn deploy --app <your-function-app>
em que
<app-name>
é o nome do aplicativo com a forma de várias arquiteturas, na qual você deseja criar a função.Para obter mais informações, consulte Usando a CLI do Fn Project para criar uma imagem com várias arquiteturas (recomendado).
- Usando o plug-in buildx do Docker:
Para criar uma imagem de várias arquiteturas na qual basear uma função a ser implantada em um aplicativo com uma forma de várias arquiteturas, informe o seguinte comando
docker buildx build
:docker buildx build --platform linux/amd64,linux/arm64 -t <your-registry>/<your-image>:<tag> --push .
Certifique-se de especificar
amd64
earm64
, e não especificar qualquer outra arquitetura.Após criar a imagem, digite o seguinte comando para enviar a imagem para o registro do Docker:
docker push <image-path>
Para obter mais informações, consulte Usando o plug-in buildx do Docker para criar uma imagem de várias arquiteturas.