Comment spécifier la limite de mémoire et de processeur dans Docker Compose version 3

114

Je ne peux pas spécifier le processeur et la mémoire pour les services spécifiés dans la version 3.

Avec la version 2, cela fonctionne très bien avec les paramètres "mem_limit" et "cpu_shares" sous les services. Mais cela échoue lors de l'utilisation de la version 3, les mettre sous la section de déploiement ne semble pas utile à moins d'utiliser le mode essaim.

Quelqu'un peut-il aider?

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
la source
4
Fournir un lien vers le problème associé créé dans le projet docker-compose: github.com/docker/compose/issues/4513
Guillaume Husta

Réponses:

94

Je sais que le sujet est un peu vieux et semble périmé, mais de toute façon j'ai pu utiliser ces options:

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

lors de l'utilisation de la version 3.7 de docker-compose

Ce qui a aidé dans mon cas, c'était d'utiliser cette commande:

docker-compose --compatibility up

--compatibility drapeau signifie (extrait de la documentation):

S'il est défini, Compose tentera de convertir les clés de déploiement dans les fichiers v3 en leur équivalent non Swarm

Je pense que c'est génial de ne pas avoir à rétablir mon fichier docker-compose en v2.

Rigi
la source
4
Il est intéressant de noter que cette option a une note : "La conversion est une tentative de" meilleur effort "et ne devrait pas être invoquée pour les déploiements de production."
bartolo-otrit
3
C'est une excellente solution pour un programme mal conçu, docker-compose. docker-compose essaie trop fort d'être ce qu'il n'est pas, un orchestrateur de qualité production: github.com/docker/compose/issues/4513
four43
1
Vos contraintes de ressources ne prendront pas effet si le conteneur RAM / CPU> Docker pour Windows / Mac est disponible. Pour changer cela, accédez à Docker pour Mac / Windows preferences-> resources et ajustez en conséquence.
8bitme le
59
deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M

En savoir plus: https://docs.docker.com/compose/compose-file/#resources

Dans votre cas spécifique:

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

Remarque:

  • Expose n'est pas nécessaire, il sera exposé par défaut sur votre réseau de pile.
  • Les images doivent être pré-construites. Construire dans la v3 n'est pas possible
  • "Redémarrer" est également obsolète. Vous pouvez utiliser le redémarrage sous déploiement avec une action en cas d'échec
  • Vous pouvez utiliser un nœud "swarm" autonome, la v3 la plupart des améliorations (sinon toutes) sont pour l'essaim

Remarque également: les réseaux en mode Swarm ne font pas de pont. Si vous souhaitez vous connecter uniquement en interne, vous devez vous connecter au réseau. Vous pouvez 1) spécifier un réseau externe dans un autre fichier de composition, ou créer le réseau avec le paramètre --attachable (docker network create -d overlay My-Network --attachable) Sinon, vous devez publier le port comme ceci:

ports:
  - 80:80
Berndinox
la source
6
1. Je peux créer des images en utilisant la version 3. <br/> 2. Il semble que l'approche pour la v3 soit complètement différente de la v2, pas comme une mise à jour. <br/> 3. Le déploiement semble fonctionner uniquement en mode essaim. Je reçois des avertissements - <br/> "AVERTISSEMENT: Certains services (nœuds) utilisent la clé 'deploy', qui sera ignorée. Compose ne prend pas en charge la configuration de déploiement - à utiliser docker stack deploypour déployer sur un essaim."
vivekyad4v
23
@ viveky4d4v Comme l'indique le document au format Compose v3, deployest ignoré si vous n'utilisez pas Swarm. Il n'y a vraiment aucune raison d'utiliser le format v3 sauf si vous utilisez Swarm.
Dan Lowe
2
Si vous démarrez un nouveau déploiement, je commencerais par la v3. Même si je n'ai qu'un seul hôte. Vous avez donc la possibilité de vous adapter plus tard et c'est le même temps dont vous aurez besoin, une fois que vous aurez compris le concept.
Berndinox
1
Salut @Connor, quand j'ai édité la réponse, tout ce que j'ai fait était de corriger un lien cassé. Comme vous, je suis incapable de déchiffrer ce que signifie ici «en interne seulement».
Jay Taylor
3
@Berndinox Savez-vous comment définir l' memory-swapoption mentionnée sur docs.docker.com/v17.12/config/containers/resource_constraints/… ? Je ne vois pas d'exemple pour le définir dans docker-compose.yml( docs.docker.com/v17.12/compose/compose-file/#resources ). Merci beaucoup.
Ryan le
49

Docker Compose ne prend pas en charge la deployclé. Il n'est respecté que lorsque vous utilisez votre fichier YAML version 3 dans une pile Docker.

Ce message est imprimé lorsque vous ajoutez la deployclé à votre docker-compose.ymlfichier, puis exécutezdocker-compose up -d

AVERTISSEMENT: certains services (base de données) utilisent la clé 'deploy', qui sera ignorée. Compose ne prend pas en charge la configuration «déployer» - à utiliser docker stack deploypour déployer sur un essaim.

La documentation ( https://docs.docker.com/compose/compose-file/#deploy ) dit:

Spécifiez la configuration liée au déploiement et à l'exécution des services. Cela prend effet uniquement lors du déploiement sur un essaim avec le déploiement de la pile docker, et est ignoré par les exécutions docker-compose up et docker-compose.

scie303
la source
2
Plus précisément, la documentation indique que si vous voulez faire cela, utilisez la v2 ou déployez pour essaimer.
ic_fl2