Como especificar o limite de memória e CPU no docker compose versão 3

112

Não consigo especificar CPU e memória para serviços especificados na versão 3.

Com a versão 2, funciona bem com os parâmetros "mem_limit" e "cpu_shares" nos serviços. Mas ele falha durante o uso da versão 3, colocá-los na seção de implantação não parece valer a pena, a menos que eu esteja usando o modo de enxame.

Alguém pode ajudar?

version: "3"
services:
  node:
    build:
     context: .
      dockerfile: ./docker-build/Dockerfile.node
    restart: always
    environment:
      - VIRTUAL_HOST=localhost
    volumes:
      - logs:/app/out/
    expose:
      - 8083
    command: ["npm","start"]
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
vivekyad4v
fonte
4
Forneça um link para o problema relacionado criado no projeto docker-compose: github.com/docker/compose/issues/4513
Guillaume Husta

Respostas:

91

Eu sei que o tópico é um pouco antigo e parece desatualizado, mas de qualquer forma, consegui usar estas opções:

    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M

ao usar a versão 3.7 do docker-compose

O que ajudou no meu caso foi usar este comando:

docker-compose --compatibility up

--compatibility bandeira significa (retirado da documentação):

Se definido, o Compose tentará converter as chaves de implantação em arquivos v3 para seus equivalentes não Swarm

Acho ótimo não ter que reverter meu arquivo docker-compose para a v2.

Rigi
fonte
4
É interessante que essa opção tenha uma observação : "A conversão é uma tentativa de" melhor esforço "e não deve ser considerada para implantações de produção."
bartolo-otrit
3
Esta é uma ótima solução para um programa mal projetado, docker-compose. docker-compose está se esforçando demais para ser o que não é, um orquestrador de nível de produção: github.com/docker/compose/issues/4513
four43
1
Suas restrições de recursos não terão efeito se o contêiner RAM / CPU> Docker para Windows / Mac estiver disponível. Para alterar isso, vá para Preferências do Docker para Mac / Windows-> recursos e ajuste de acordo.
8bitme
59
deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M

Mais: https://docs.docker.com/compose/compose-file/#resources

No seu caso específico:

version: "3"
services:
  node:
    image: USER/Your-Pre-Built-Image
    environment:
      - VIRTUAL_HOST=localhost
    volumes:
      - logs:/app/out/
    command: ["npm","start"]
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M

volumes:
  - logs

networks:
  default:
    driver: overlay

Nota:

  • Expor não é necessário, ele será exposto por padrão em sua rede de pilha.
  • As imagens devem ser pré-construídas. Não é possível compilar na v3
  • "Reiniciar" também está obsoleto. Você pode usar reiniciar sob implantação com ação em caso de falha
  • Você pode usar um nó autônomo "enxame", a maioria das melhorias v3 (se não todas) são para enxame

Observe também: Redes no modo Swarm não fazem ponte. Se desejar se conectar apenas internamente, será necessário conectar-se à rede. Você pode 1) especificar uma rede externa em outro arquivo de composição ou criar a rede com o parâmetro --attachable (docker network create -d overlay My-Network --attachable) Caso contrário, você terá que publicar a porta desta forma:

ports:
  - 80:80
Berndinox
fonte
6
1. Consigo construir imagens usando a versão 3. <br/> 2. Parece que a abordagem para a v3 é completamente diferente da v2, não como uma atualização. <br/> 3. O Deploy parece estar funcionando apenas no modo swarm. Estou recebendo avisos - <br/> "AVISO: alguns serviços (nó) usam a chave 'implantar', que será ignorada. O Compose não oferece suporte à configuração de implantação - use docker stack deploypara implantar em um enxame."
vivekyad4v
23
@ viveky4d4v Como afirma o documento do formato Compose v3, deployé ignorado se você não estiver usando Swarm. Não há realmente nenhuma razão para usar o formato v3 a menos que você esteja usando o Swarm.
Dan Lowe de
2
Se começar uma nova implantação, eu começaria com a v3. Mesmo se eu tiver apenas um host. Então você tem a possibilidade de escalar mais tarde e é o mesmo tempo que você vai precisar, uma vez que você entenda o conceito.
Berndinox de
1
Olá @Connor, quando editei a resposta tudo que fiz foi corrigir um link quebrado. Como você, não consigo decifrar o que "apenas internamente" significa aqui.
Jay Taylor
3
@Berndinox Você sabe como definir a memory-swapopção mencionada em docs.docker.com/v17.12/config/containers/resource_constraints/… ? Não vejo um exemplo de como defini-lo em docker-compose.yml( docs.docker.com/v17.12/compose/compose-file/#resources ). Muito obrigado.
Ryan
49

O Docker Compose não oferece suporte para a deploychave. Ele só é respeitado quando você usa o arquivo YAML da versão 3 em um Docker Stack.

Esta mensagem é impressa quando você adiciona a deploychave ao seu docker-compose.ymlarquivo e depois executadocker-compose up -d

AVISO: Alguns serviços (banco de dados) usam a chave 'implantar', que será ignorada. O Compose não oferece suporte à configuração de 'implantação' - use docker stack deploypara implantar em um enxame.

A documentação ( https://docs.docker.com/compose/compose-file/#deploy ) diz:

Especifique a configuração relacionada à implantação e execução de serviços. Isso só tem efeito ao implantar em um swarm com docker stack deploy e é ignorado por docker-compose up e docker-compose run.

saw303
fonte
2
Especificamente, os documentos dizem que se você quiser fazer isso, use a v2 ou implante para enxamear.
ic_fl2