Práticas recomendadas para imagens de contêiner do Amazon ECS - Amazon Elastic Container Service

Práticas recomendadas para imagens de contêiner do Amazon ECS

Uma imagem de contêiner é um conjunto de instruções sobre como criar o contêiner. Uma imagem de contêiner contém o código da aplicação e todas as dependências que o código da aplicação requer para ser executado. As dependências da aplicação incluem os pacotes de código-fonte dos quais seu código de aplicação depende, um runtime de linguagem para linguagens interpretadas e pacotes binários dos quais seu código vinculado dinamicamente depende.

Use as diretrizes a seguir ao projetar e criar suas imagens de contêiner:

  • Complete suas imagens de contêiner armazenando todas as dependências da aplicação como arquivos estáticos dentro da imagem do contêiner.

    Se você alterar algo na imagem do contêiner, crie uma imagem de contêiner com as alterações.

  • Execute um único processo de aplicação em um contêiner.

    A vida útil do contêiner é tão longa quanto a execução do processo da aplicação. O Amazon ECS substitui processos com falha e determina onde executar o processo de substituição. Uma imagem completa torna a implantação geral mais resiliente.

  • Faça com que a aplicação processe SIGTERM.

    Quando o Amazon ECS interrompe uma tarefa, primeiro envia um sinal SIGTERM à tarefa para notificar que a aplicação precisa terminar e desligar. Em seguida, o Amazon ECS envia uma mensagem de SIGKILL. Quando as aplicações ignoram o SIGTERM, o serviço do Amazon ECS deve esperar para enviar o sinal SIGKILL antes de encerrar o processo.

    Você precisa identificar quanto tempo leva para a aplicação concluir o trabalho e garantir que as aplicações processem o sinal SIGTERM. O tratamento de sinais da aplicação precisa impedir que a aplicação realize um novo trabalho, concluindo o trabalho que está em andamento, ou salvar o trabalho inacabado no armazenamento fora da tarefa, caso demore muito para ser concluído.

  • Configure aplicações contêineres para gravar logs em stdout e stderr.

    Desacoplar o tratamento de logs do código da aplicação oferece flexibilidade para ajustar o tratamento de logs no nível da infraestrutura. Um exemplo disso é alterar seu sistema de registro em log. Em vez de modificar seus serviços e criar e implantar uma imagem de contêiner, você pode ajustar as configurações.

  • Use tags para criar versões das imagens do contêiner.

    As imagens do contêiner são armazenadas em um registro do contêiner. Cada imagem em um registro é identificada por uma tag. Há uma tag chamada latest. Essa tag funciona como um ponteiro para a versão mais recente da imagem do contêiner da aplicação, semelhante à HEAD de um repositório git. Recomendamos usar a tag latest apenas para fins de teste. Como prática recomendada, atribua tags a imagens de contêiner usando uma tag exclusiva para cada compilação. Recomendamos que você atribua tags a suas imagens usando o SHA do git para o git commit que foi usado para criar a imagem.

    Não será necessário criar uma imagem de contêiner para cada commit. No entanto, recomendamos que você crie uma nova imagem de contêiner sempre que liberar uma confirmação de código específica para o ambiente de produção. Também recomendamos que você atribua uma tag à imagem usando uma tag que corresponda ao git commit do código que está dentro da imagem. Se você atribuiu uma tag à imagem com o git commit, poderá descobrir mais rapidamente qual versão do código a imagem está executando.

    Também recomendamos que você ative as tags de imagem imutáveis no Amazon Elastic Container Registry. Com essa configuração, você não pode alterar a imagem do contêiner para a qual uma tag aponta. Em vez disso, o Amazon ECR impõe que uma nova imagem seja carregada em uma nova tag. Para obter mais informações, consulte Mutabilidade da tag de imagem no Guia do usuário do Amazon ECR.

Ao arquitetar a aplicação para execução no AWS Fargate, você deve optar entre implantar vários contêineres na mesma definição de tarefa e implantar contêineres separadamente em várias definições de tarefa. Se as seguintes condições forem necessárias, recomendamos implantar vários contêineres na mesma definição de tarefa:

  • Os contêineres compartilham um ciclo de vida comum (ou seja, eles são iniciados e encerrados juntos).

  • Os contêineres precisam ser executados no mesmo host subjacente (ou seja, um contêiner faz referência ao outro na porta localhost).

  • Seus contêineres compartilham recursos.

  • Os contêineres compartilham volumes de dados.

Se essas condições não forem necessárias, recomendamos implantar contêineres separadamente em várias definições de tarefa. Isso permite escalar, provisionar e desprovisionar os contêineres separadamente.