Как указать ограничение памяти и процессора в докере составляют версию 3

Я не могу указать CPU и память для служб, указанных в версии 3.

С версией 2 он отлично работает с параметрами "mem_limit" и "cpu_shares" под услугами. Но сбой при использовании версии 3, если поставить их в раздел развертывания, не кажется достойным, если я не использую режим роя.

Может ли кто-нибудь помочь?

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

Ответ 1

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

Подробнее: https://docs.docker.com/compose/compose-file/#resources

В вашем конкретном случае:

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

Замечания:

  • Expose не является необходимым, он будет выставлен по умолчанию в вашей сети стека.
  • Изображения должны быть предварительно построены. Сборка в v3 невозможна
  • "Перезагрузка" также устарела. Вы можете использовать перезагрузку при развертывании с действием по ошибке
  • Вы можете использовать отдельный узел "роя", v3 большинство улучшений (если не все) предназначены для роя

Также обратите внимание: сети в режиме Swarm не соединяются. Если вы хотите подключиться только внутри, вы должны подключиться к сети. Вы можете 1) указать внешнюю сеть в другом файле компоновки или создать сеть с параметром --attachable (docker network создать оверлей -d My-Network --attachable). В противном случае вы должны опубликовать порт следующим образом:

ports:
  - 80:80

Ответ 2

Docker Compose не поддерживает ключ deploy. Это соблюдается только при использовании вашего файла YAML версии 3 в стеке Docker.

Это сообщение печатается, когда вы добавляете ключ deploy в файл docker-compose.yml а затем запускаете docker-compose up -d

ВНИМАНИЕ: Некоторые сервисы (база данных) используют ключ 'deploy', который будет игнорироваться. Compose не поддерживает конфигурацию 'deploy' - используйте docker stack deploy для развертывания в рое.

Документация (https://docs.docker.com/compose/compose-file/#deploy) гласит:

Укажите конфигурацию, связанную с развертыванием и запуском сервисов. Это действует только при развертывании в рой с развертыванием стека докеров и игнорируется при выполнении docker-compose up и docker-compose.

Ответ 3

Я знаю, что эта тема немного устарела и кажется устаревшей, но в любом случае я смог использовать следующие параметры:

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

при использовании 3.7 версии docker-compose

Что помогло в моем случае, было использовать эту команду:

docker-compose --compatibility up

Флаг --compatibility обозначает (взят из документации):

If set, Compose will attempt to convert deploy keys in v3 files to their non-Swarm equivalent

Думаю, это здорово, что мне не нужно возвращать свой файл docker-compose обратно в v2.