Как указать ограничение памяти и ЦП в docker compose версии 3

114

Я не могу указать ЦП и память для служб, указанных в версии 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
vivekyad4v
источник
4
Предоставьте ссылку на связанную проблему, созданную в проекте docker-compose: github.com/docker/compose/issues/4513
Гийом Хуста,

Ответы:

98

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

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

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

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

docker-compose --compatibility up

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

Если установлено, Compose попытается преобразовать ключи развертывания в файлах v3 в их эквиваленты, отличные от Swarm.

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

Риги
источник
4
Интересно, что у этой опции есть примечание : «Преобразование - это попытка« сделать все возможное », и на нее не следует полагаться при производственном развертывании».
bartolo-otrit
3
Это отличное исправление для плохо спроектированной программы docker-compose. docker-compose слишком старается быть тем, чем он не является, оркестратором производственного уровня: github.com/docker/compose/issues/4513
four43
1
Ваши ограничения ресурсов не вступят в силу, если доступен контейнер RAM / CPU> Docker для Windows / Mac. Чтобы изменить это, перейдите в настройки Docker для Mac / Windows-> ресурсы и настройте соответствующим образом.
8bitme
59
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) указать внешнюю сеть в другом файле compose или создать сеть с параметром --attachable (docker network create -d overlay My-Network --attachable) В противном случае вы должны опубликовать порт следующим образом:

ports:
  - 80:80
Berndinox
источник
6
1. Я могу создавать образы, используя версию 3. <br/> 2. Похоже, подход к v3 полностью отличается от v2, а не как апгрейд. <br/> 3. Похоже, что развертывание работает только в режиме роя. Я получаю предупреждения - <br/> «ПРЕДУПРЕЖДЕНИЕ: некоторые службы (узлы) используют ключ« deploy », который будет проигнорирован. Compose не поддерживает конфигурацию развертывания - используйте docker stack deployдля развертывания в рой.»
vivekyad4v
23
@ viveky4d4v Как указано в документе Compose format v3, deployигнорируется, если вы не используете Swarm. На самом деле нет причин использовать формат v3, если вы не используете Swarm.
Дэн Лоу
2
Если я начинаю новое развертывание, я бы начал с v3. Даже если у меня всего один хост. Таким образом, у вас есть возможность масштабирования позже, и это столько же времени вам понадобится, как только вы поймете концепцию.
Berndinox
1
Привет, @Connor, когда я редактировал ответ, все, что я сделал, это исправил неработающую ссылку. Как и вы, я не могу понять, что здесь означает «только внутренне».
Джей Тейлор
3
@Berndinox Вы случайно не знаете, как установить memory-swapпараметр, упомянутый на docs.docker.com/v17.12/config/containers/resource_constraints/… ? Я не вижу примера того, как установить его в docker-compose.yml( docs.docker.com/v17.12/compose/compose-file/#resources ). Спасибо.
Ryan
50

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

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

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

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

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

пила303
источник
2
В частности, в документации говорится, что если вы хотите это сделать, используйте v2 или разверните для роения.
ic_fl2
С помощью docker-compose 3.7 вы можете добавить флаг --compatibility, и он переведет ограничения развертывания в вашем 3.x файле на выполнение без роя. например, docker-compose --compatibility up
Дэвид Томас