Cómo especificar el límite de memoria y CPU en docker compose versión 3

112

No puedo especificar la CPU y la memoria para los servicios especificados en la versión 3.

Con la versión 2, funciona bien con los parámetros "mem_limit" y "cpu_shares" en los servicios. Pero falla al usar la versión 3, ponerlos en la sección de implementación no parece valioso a menos que esté usando el modo enjambre.

¿Alguien puede ayudar?

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
fuente
4
Proporcione un enlace al problema relacionado creado en el proyecto docker-compose: github.com/docker/compose/issues/4513
Guillaume Husta

Respuestas:

91

Sé que el tema es un poco antiguo y parece obsoleto, pero de todos modos pude usar estas opciones:

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

al usar la versión 3.7 de docker-compose

Lo que ayudó en mi caso fue usar este comando:

docker-compose --compatibility up

--compatibility representa la bandera (tomado de la documentación):

Si se establece, Compose intentará convertir las claves de implementación en archivos v3 a su equivalente que no sea Swarm

Creo que es genial, que no tengo que revertir mi archivo docker-compose a v2.

Rigi
fuente
4
Es interesante que esta opción tenga una nota : "La conversión es un intento de" mejor esfuerzo "y no se debe confiar en las implementaciones de producción".
bartolo-otrit
3
Esta es una gran solución para un programa mal diseñado, docker-compose. docker-compose se está esforzando demasiado para ser lo que no es, un orquestador de grado de producción: github.com/docker/compose/issues/4513
four43
1
Las restricciones de recursos no surtirán efecto si el contenedor RAM / CPU> Docker para Windows / Mac está disponible. Para cambiar esto, vaya a Docker para Mac / Preferencias de Windows-> recursos y ajuste en consecuencia.
8bitme
59
deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M

Más: https://docs.docker.com/compose/compose-file/#resources

En tu 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:

  • Exponer no es necesario, estará expuesto por defecto en su red de pila.
  • Las imágenes deben estar preconstruidas. No es posible construir dentro de v3
  • "Reiniciar" también está obsoleto. Puede usar reiniciar en implementación con acción en caso de falla
  • Puede utilizar un "enjambre" independiente de un nodo, v3 la mayoría de las mejoras (si no todas) son para enjambre

También tenga en cuenta: las redes en modo Swarm no se unen. Si desea conectarse solo internamente, debe conectarse a la red. Puede 1) especificar una red externa dentro de otro archivo de composición, o tener que crear la red con el parámetro --attachable (docker network create -d overlay My-Network --attachable) De lo contrario, debe publicar el puerto de esta manera:

ports:
  - 80:80
Berndinox
fuente
6
1. Puedo crear imágenes usando la versión 3. <br/> 2. Parece que el enfoque para la v3 es completamente diferente de la v2, no como una actualización. <br/> 3. La implementación parece funcionar solo en modo enjambre. Recibo advertencias: <br/> "ADVERTENCIA: Algunos servicios (nodos) usan la clave 'implementar', que se ignorará. Compose no admite la configuración docker stack deployde implementación
úsela
23
@ viveky4d4v Como dice el documento de Compose format v3, deployse ignora si no está usando Swarm. Realmente no hay razón para usar el formato v3 a menos que esté usando Swarm.
Dan Lowe
2
Si comenzaba una nueva implementación, comenzaría con v3. Incluso si solo tengo un anfitrión. Entonces tienes la posibilidad de escalar más tarde y es la misma cantidad de tiempo que necesitarás, una vez que entiendas el concepto.
Berndinox
1
Hola @Connor, cuando edité la respuesta, todo lo que hice fue corregir un enlace roto. Como tú, no puedo descifrar qué significa aquí "solo internamente".
Jay Taylor
3
@Berndinox ¿Sabe cómo configurar la memory-swapopción mencionada en docs.docker.com/v17.12/config/containers/resource_constraints/… ? No veo un ejemplo de cómo configurarlo docker-compose.yml( docs.docker.com/v17.12/compose/compose-file/#resources ). Muchas gracias.
Ryan
49

Docker Compose no admite la deployclave. Solo se respeta cuando usa su archivo YAML de la versión 3 en un Docker Stack.

Este mensaje se imprime cuando agrega la deployclave a su docker-compose.ymlarchivo y luego ejecutadocker-compose up -d

ADVERTENCIA: Algunos servicios (base de datos) usan la clave 'implementar', que será ignorada. Compose no admite la configuración de "implementación": utilícelo docker stack deploypara implementar en un enjambre.

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

Especifique la configuración relacionada con la implementación y ejecución de servicios. Esto solo tiene efecto cuando se implementa en un enjambre con la implementación de la pila de docker, y docker-compose up y docker-compose run lo ignoran.

saw303
fuente
2
Específicamente, los documentos dicen que si desea hacer esto, use v2 o implemente para enjambre.
ic_fl2