Сообщение об ошибке “Error: can only create exec sessions on running containers: container state improper” обычно возникает, когда вы пытаетесь выполнить команду внутри контейнера Docker с помощью docker exec, но контейнер находится не в том состоянии, чтобы принимать команды.
Обычно это означает, что контейнер не запущен.
# docker run -td --name test_image custom-docker-releases.repo3.cci.dummy.net/build_centos8_rocky:latest 312b0fc5642a7670a2c3ee9561880f62320dc4587ee7683fefbe3237af978a10 # docker exec -ti test_image bash Error: can only create exec sessions on running containers: container state improper
Понимание состояния контейнеров Docker
Контейнеры Docker могут находиться в нескольких различных состояниях, каждое из которых указывает на определенный этап их жизненного цикла.
Вы можете проверить состояние контейнера с помощью таких команд, как docker ps для запущенных контейнеров и docker ps -a для всех контейнеров, включая незапущенные.
Вот подробное объяснение каждого состояния:
- Created: Контейнер был создан, но не запущен. Он инициализирован и готов к работе, но пока не выполняет никаких процессов.
- Running: Контейнер активно работает. Его основной процесс работает, и он способен выполнять команды и задачи.
- Paused: Процессы контейнера временно приостановлены. Он находится в приостановленном состоянии, экономя ресурсы без полной остановки.
- Exited: Контейнер прекратил работу. Это происходит после завершения его основного процесса или если контейнер остановлен вручную.
- Restarting: Контейнер находится в процессе остановки и последующего запуска, обычно запускаемого политикой перезапуска контейнера.
- Dead: контейнер находится в нефункциональном состоянии, часто из-за системных ошибок или проблем в демоне Docker, которые не позволяют управлять им должным образом.
- Removing: Контейнер находится в процессе удаления из системы. Это переходное состояние в процессе удаления.
Распространенные причины возникновения ошибки
Если вы столкнулись с ошибкой “Error: can only create exec sessions on running containers: container state improper”, существует несколько распространенных причин, по которым может возникнуть эта проблема.
- Контейнер остановился или потерпел крах. Это может произойти из-за завершения основного процесса внутри контейнера или из-за ошибки при запуске контейнера.
- Контейнер приостановлен. Когда контейнер приостановлен, все его процессы также приостанавливаются, и он не может принимать новые команды.
- Контейнер находится в процессе запуска, но еще не полностью запущен.
Как решить проблему “Ошибка: можно создавать сеансы exec только в запущенных контейнерах”
- Проверьте состояние контейнера: Сначала проверьте статус контейнера с помощью docker ps -a. Найдите нужный контейнер и проверьте его состояние.
- Запустите контейнер: Если контейнер не запущен, запустите его с помощью команды docker start [имя_контейнера_или_имя_имя_контейнера].
- Снимите контейнер с паузы: Если контейнер приостановлен, снимите его с паузы с помощью команды docker unpause [имя_контейнера_или_имя_имя_имя_имя_имя_имени].
- Продолжить работу контейнера: Задайте точку входа и укажите пользовательскую команду для поддержания его работы [docker run –entrypoint /bin/bash container_name_or_id -c “sleep 999999”].
В моем случае я установил пользовательскую точку входа и добавил команду sleep для поддержания контейнера в рабочем состоянии:
docker run --entrypoint /bin/bash custom-docker-releases.repo3.cci.dummy.net/build_centos8_rocky:latest -c "sleep 999999"
Затем проверьте, запущен ли процесс docker.
]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES .... d7bb60af1cfc custom-docker-releases.repo3.cci.dummy.net/build_centos8_rocky:latest -c sleep 999999 5 hours ago Up 5 hours ago nice_stonebraker
Затем подключитесь к образу контейнера
~]# docker exec -ti d7bb60af1cfc bash [root@d7bb60af1cfc /]#
Как только вы закончите, завершите процесс
~]# docker kill d7bb60af1cfc
Заключение
В статье представлено полное руководство по устранению ошибки “Error: can only create exec sessions on running containers: container state improper”, часто встречающейся в Docker.
Эта ошибка обычно возникает при попытке выполнить команду в контейнере Docker, который не находится в “работающем” состоянии.
В статье подчеркивается, что контейнеры Docker должны находиться в запущенном состоянии, чтобы принимать команды exec, а другие состояния, приводят к этой проблеме.
В статье описаны распространенные причины этой ошибки, включая сценарии, когда контейнер остановился, разбился, находится в состоянии паузы или все еще инициализируется.
Неправильные идентификаторы контейнеров или проблемы с демоном Docker также могут вызывать эту проблему.
см. также:
- 🐳 Переключение пользователя в образе или контейнере Docker
- 🐳 Использование if-else в Dockerfile
- 🐳 Разница между ENTRYPOINT и CMD в Dockerfile
- 🐳 Как перезапустить службу docker, не затрагивая запущенные контейнеры