Ответ
В нативной среде Docker изменить лимиты CPU/RAM для запущенного контейнера без его остановки невозможно. Docker требует пересоздания контейнера с новыми параметрами.
Однако в оркестраторах, таких как Kubernetes, можно обновить конфигурацию ресурсов для рабочих нагрузок (Deployment, StatefulSet), что приведет к плавному редеплою — старые поды будут заменены новыми с новыми лимитами.
Способ 1: Патчинг манифеста Deployment в Kubernetes
# Меняем requests и limits для контейнера 'app' в Deployment 'my-service'
kubectl patch deployment my-service --type='json' -p='[
{
"op": "replace",
"path": "/spec/template/spec/containers/0/resources",
"value": {
"requests": { "cpu": "200m", "memory": "256Mi" },
"limits": { "cpu": "500m", "memory": "512Mi" }
}
}
]'
После этой команды Kubernetes запустит новые поды с обновленными ресурсами и постепенно завершит старые, соблюдая стратегию обновления.
Способ 2: Прямое редактирование манифеста
kubectl edit deployment my-service
# В редакторе находим блок `resources`, меняем значения, сохраняем и выходим.
Способ 3: Для standalone Docker-контейнера
Единственный вариант — остановить контейнер и запустить заново с флагами --cpus и --memory.
docker stop my_container
docker run -d --name my_container --cpus="1.5" --memory="1g" my_image:latest
Важные ограничения:
- Уменьшение лимита памяти ниже текущего потребления процесса может привести к немедленному завершению контейнера (OOMKill).
- Изменение
requestsв Kubernetes влияет на планирование (scheduling) новых подов, но не на уже работающие.