I want to set a CPU limit on a container in a docker-compose file.
When I execute the following:
docker run -d --rm --cpus 0.3 --name aaa progrium/stress -c 8 -t 20s
The container is taking 30% of a core according to docker stats:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
d6be318a85e6 aaa 29.01% 1.328MiB / 3.805GiB 0.03% 806B / 0B 0B / 0B 9
And the limit is set according to docker inspect:
$ docker inspect aaa | grep -i cpu
"CpuShares": 0,
"NanoCpus": 300000000,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"CpuCount": 0,
"CpuPercent": 0,
This is expected behavior. But when I write the following docker-compose.yml file:
version: '3'
services:
aaa:
image: progrium/stress
command: -c 8 -t 20s
deploy:
resources:
limits:
memory: 100M
cpus: '0.3'
And start the project with docker-compose up -d
; I got the following stats output:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a94118f4a5f7 docker-aaa-1 87.74% 1.359MiB / 100MiB 1.36% 806B / 0B 1.91MB / 0B 9
And the limit is not set in the inspect output. I expected to see a CPU limit:
$ docker inspect docker-aaa-1 | grep -i cpu
"CpuShares": 0,
"NanoCpus": 0,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"CpuCount": 0,
"CpuPercent": 0,
My conclusions are:
docker-compose.yml
file are read (docker stats explicitly show memory limitI tried to set cpu limit the old way (as mentioned in the compose file documentation).
version: '2'
services:
aaa:
image: progrium/stress
command: -c 8 -t 20s
cpus: 0.3
The result is the same (no limit on CPU). And no error message from docker-compose.
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8658bc78c795 docker-aaa-1 180.75% 1.367MiB / 3.805GiB 0.04% 1.18kB / 0B 0B / 0B 9
How can I ask docker-compose to set the CPU limit? What documentation or configuration lines did I miss?
Thanks for your help!
Versions:
$ docker-compose -v
Docker Compose version v2.4.1
$ docker -v
Docker version 20.10.21, build baeda1f
$ uname -a
Linux hostname 5.10.0-18-amd64 #1 SMP Debian 5.10.140-1 (2022-09-02) x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
Turns out this is a solved bug, an update fixed it… Thanks for your time.