Come specificare il limite di memoria e CPU in docker compose versione 3


112

Non riesco a specificare CPU e memoria per i servizi specificati nella versione 3.

Con la versione 2 funziona bene con i parametri "mem_limit" e "cpu_shares" nei servizi. Ma fallisce durante l'utilizzo della versione 3, metterli nella sezione deploy non sembra degno a meno che non stia usando la modalità swarm.

Qualcuno può aiutare?

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

4
Fornire un collegamento al problema correlato creato nel progetto
docker

Risposte:


91

So che l'argomento è un po 'vecchio e sembra obsoleto, ma comunque sono stato in grado di utilizzare queste opzioni:

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

quando si utilizza la versione 3.7 di docker-compose

Ciò che ha aiutato nel mio caso, è stato usare questo comando:

docker-compose --compatibility up

--compatibility flag sta per (tratto dalla documentazione):

Se impostato, Compose tenterà di convertire le chiavi di distribuzione nei file v3 nel loro equivalente non Swarm

Penso che sia fantastico, che non devo ripristinare il mio file docker-compose alla v2.


4
È interessante notare che questa opzione ha una nota : "La conversione è un tentativo di" massimo sforzo "e non dovrebbe essere invocata per le distribuzioni di produzione."
bartolo-otrit

3
Questa è un'ottima soluzione per un programma mal progettato, docker-compose. docker-compose sta cercando di essere quello che non è, un orchestratore di livello di produzione: github.com/docker/compose/issues/4513
four43

1
I vincoli relativi alle risorse non avranno effetto se è disponibile RAM / CPU del contenitore> Docker per Windows / Mac. Per cambiarlo, vai su Docker per le preferenze di Mac / Windows-> risorse e regola di conseguenza.
8bitme

59
deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M

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

Nel tuo caso specifico:

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:

  • Expose non è necessario, verrà esposto per impostazione predefinita sulla rete dello stack.
  • Le immagini devono essere pre-costruite. La compilazione all'interno della v3 non è possibile
  • Anche "Restart" è deprecato. È possibile utilizzare il riavvio durante la distribuzione con l'azione in caso di errore
  • È possibile utilizzare uno "swarm" autonomo a un nodo, v3 la maggior parte dei miglioramenti (se non tutti) sono per lo sciame

Nota anche: le reti in modalità Swarm non si collegano. Se desideri connetterti solo internamente, devi collegarti alla rete. Puoi 1) specificare una rete esterna all'interno di un altro file di composizione, o creare la rete con il parametro --attachable (docker network create -d overlay My-Network --attachable) Altrimenti devi pubblicare la porta in questo modo:

ports:
  - 80:80

6
1. Sono in grado di creare immagini utilizzando la versione 3. <br/> 2. Sembra che l'approccio per v3 sia completamente diverso da v2, non come un aggiornamento. <br/> 3. La distribuzione sembra funzionare solo in modalità sciame. Ricevo avvisi - <br/> "ATTENZIONE: alcuni servizi (nodo) utilizzano la chiave 'deploy', che verrà ignorata. Compose non supporta la configurazione docker stack deploydeploy
usala

23
@ viveky4d4v Come afferma il documento in formato Compose v3, deployviene ignorato se non si utilizza Swarm. Non c'è davvero alcun motivo per usare il formato v3 a meno che tu non stia usando Swarm.
Dan Lowe

2
Se si avvia una nuova distribuzione, inizierei con v3. Anche se ho solo un host. Quindi hai la possibilità di ridimensionare in seguito ed è la stessa quantità di tempo che ti servirà, una volta compreso il concetto.
Berndinox

1
Ciao @ Connor, quando ho modificato la risposta non ho fatto altro che correggere un collegamento interrotto. Come te, non sono in grado di decifrare cosa significhi "solo internamente" qui.
Jay Taylor

3
@Berndinox Ti capita di sapere come impostare l' memory-swapopzione menzionata in docs.docker.com/v17.12/config/containers/resource_constraints/… ? Non vedo un esempio di come impostarlo in docker-compose.yml( docs.docker.com/v17.12/compose/compose-file/#resources ). Grazie mille.
Ryan

49

Docker Compose non supporta la deploychiave. Viene rispettato solo quando utilizzi il tuo file YAML versione 3 in uno Stack Docker.

Questo messaggio viene stampato quando si aggiunge la deploychiave al docker-compose.ymlfile e quindi viene eseguitodocker-compose up -d

ATTENZIONE: alcuni servizi (database) utilizzano la chiave "deploy", che verrà ignorata. Compose non supporta la configurazione "deploy": utilizzare docker stack deployper eseguire il deploy in uno sciame.

La documentazione ( https://docs.docker.com/compose/compose-file/#deploy ) dice:

Specificare la configurazione relativa alla distribuzione e all'esecuzione dei servizi. Ciò ha effetto solo quando si distribuisce in uno sciame con la distribuzione dello stack docker e viene ignorato da docker-compose up e docker-compose run.


2
In particolare, i documenti dicono che se vuoi farlo, usa v2 o distribuisci su swarm.
ic_fl2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.