How to specify Memory & CPU limit in docker compose version 3

DockerDocker Compose

Docker Problem Overview


I am unable to specify CPU and memory limitation for services specified in version 3.

With version 2 it works fine with mem_limit & cpu_shares parameters under the services. But it fails while using version 3, putting them under deploy section doesn't seem worthy unless I am using swarm mode.

Can somebody help?

    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

Docker Solutions


Solution 1 - Docker

I know the topic is a bit old and seems stale, but anyway I was able to use these options:

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

when using 3.7 version of docker-compose

What helped in my case, was using this command:

docker-compose --compatibility up

--compatibility flag stands for (taken from the documentation):

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

Think it's great, that I don't have to revert my docker-compose file back to v2.

Solution 2 - Docker

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

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

In you specific case:

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

Note:

  • Expose is not necessary, it will be exposed per default on your stack network.
  • Images have to be pre-built. Build within v3 is not possible
  • "Restart" is also deprecated. You can use restart under deploy with on-failure action
  • You can use a standalone one node "swarm", v3 most improvements (if not all) are for swarm

Also Note: Networks in Swarm mode do not bridge. If you would like to connect internally only, you have to attach to the network. You can 1) specify an external network within an other compose file, or have to create the network with --attachable parameter (docker network create -d overlay My-Network --attachable) Otherwise you have to publish the port like this:

ports:
  - 80:80

Solution 3 - Docker

Docker Compose does not support the deploy key. It's only respected when you use your version 3 YAML file in a Docker Stack.

This message is printed when you add the deploy key to you docker-compose.yml file and then run docker-compose up -d

> WARNING: Some services (database) use the 'deploy' key, which will be > ignored. Compose does not support 'deploy' configuration - use docker > stack deploy to deploy to a swarm.

The documentation (https://docs.docker.com/compose/compose-file/#deploy) says:

> Specify configuration related to the deployment and running of > services. This only takes effect when deploying to a swarm with docker > stack deploy, and is ignored by docker-compose up and docker-compose > run.

Solution 4 - Docker

I have other experiences, maybe somebody can explain this.

Maybe this is bug(i think this is a feature), but, I am able to use deployments limits (memory limits) in docker-compose without swarm, hovever CPU limits doesn't work but replication does.

$> docker-compose --version
docker-compose version 1.29.2
$> docker  --version
Docker version 20.10.12
version: '3.2'

services:
  limits-test:
    image: alexeiled/stress-ng
    command: [
     '--vm', '1', '--vm-bytes', '20%', '--vm-method', 'all', '--verify', '-t', ' 10m', '-v'

    ]
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 1024M

Docker stats

b647e0dad247   dc-limits_limits-test_1   0.01%     547.1MiB / 1GiB     53.43%    942B / 0B   0B / 0B     3

Edited, thx @Jimmix

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionvivekyad4vView Question on Stackoverflow
Solution 1 - DockerRigiView Answer on Stackoverflow
Solution 2 - DockerBerndinoxView Answer on Stackoverflow
Solution 3 - Dockersaw303View Answer on Stackoverflow
Solution 4 - DockerdoodzioView Answer on Stackoverflow