Каждый уважающий себя админ Linux рано или поздно задумывается о том, как получить shell в контейнере ну или как запустить там команду.
Скажу сразу что это конечно возможно, но не всегда получится выполнить ту или иную команду, которую можно выполнить в самой ОС. Так как образ контейнера обычно содержит только минимум необходимого для работы приложения многие пакеты там не установлены. Например, не удивляйтесь если внутри контейнера не будет telnet.
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bdc2d2440db9 nginx:latest "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 80/tcp some-nginx
ca55f6abaa03 mariadb:latest "docker-entrypoint.s…" 23 minutes ago Up 23 minutes 3306/tcp some-mariadb
docker container run -it (docker run)
Если вы ещё не знаете за что отвечает команда docker container run, то рекомендую к прочтению эту статью.
Команда docker container run -it — это один из самых часто используемых способов запуска контейнера в интерактивном режиме (то есть “с живым терминалом”). Флаги -it расшифровываются как:
-i- Оставляет стандартный ввод (stdin) открытым, чтобы можно было вводить команды (interactive)-t- Создаёт псевдотерминал (teletype terminal)
Т.е. если я сейчас запущу команду docker run -it --name some-nginx-2 nginx:latest bash то команду выполняемая при старте контейнера по умолчанию сменится на команду bash.
docker run -it --name some-nginx-2 nginx:latest bash
root@57e565dc144f:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp
Теперь сравним команды, которые выполнились при старте обычно созданного контейнера some-nginx и some-nginx-2.
docker inspect -f ' ' some-nginx
docker inspect -f ' ' some-nginx-2
/docker-entrypoint.sh [nginx -g daemon off;]
/docker-entrypoint.sh [bash]
Понятное дело, что во втором случаем сам nginx не запустился, а вместо него запустился bash. На это стоит обратить внимание. И так как контейнер работает только пока сама выполняемая команда внутри запущена после выхода из контейнера с bash происходит выход из bash и сам контейнер останавливается.
docker run -it --name some-ubuntu ubuntu:latest bash
root@faf026693bf7:/#
exit
docker ps -a
faf026693bf7 ubuntu:latest "bash" 27 seconds ago Exited (0) 11 seconds ago some-ubuntu
Поэтому если вам нужно просто запустить временный контейнер лучше воспользоваться командой docker run --rm -it --name some-ubuntu ubuntu:latest bash
ubuntu:latest- в качестве образа для контейнера используем ubuntu--rm- удаляет автоматически контейнер после выхода из него
### docker container start -ai
Для того чтобы запустить остановленный контейнер с командой bash и сразу попасть в псевдотерминал контейнера можно использовать команду docker container start -ai some-ubuntu.
Даже если контейнер уже запущен также можно использовать эту команду, но лучше будет использовать команду ниже. Дело в том, что тут запускается команда по умолчанию, т.е. если выполнить docker container start -ai some-nginx то вы прост попадёте в консоль с запущенным nginx и при выходе из сессии просто выключите контейнер.
docker container start some-nginx -ai
CTRL+C
2025/10/22 05:33:28 [notice] 1#1: worker process 28 exited with code 0
2025/10/22 05:33:28 [notice] 1#1: exit
### docker container exec
Если контейнер у вас уже запущен и команда там по умолчанию не bash, то используем команду docker container exec -it. Для примера я выполню эту команду для контейнера с nginx и получу доступ к отдельному псевдотерминалу, который никак не повлияет на работу самого nginx внутри контейнера.
docker container exec -it some-nginx bash
root@bdc2d2440db9:/# ls /etc/nginx/conf.d/
default.conf
Если же необходимо просто выполнить команду внутри контейнера, при этом не входя, а него можно выполнить docker exec some-nginx cat /etc/nginx/nginx.conf, т.е. вместо флагов -it прописываем саму команду.
docker exec some-nginx cat /etc/nginx/nginx.conf
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
unable to start container process: exec: “bash”
Я уже говорил, что не всё что вы пытаетесь выполнить внутри контейнера будет работать потому что образ контейнера всегда пытаются уменьшить в размерах, ведь это как истина контейнеризации. Получается в некоторых образах нет многих бинарных файлов, которые вы привыкли видеть у себя в ОС.
Решением тут будет устанавливать эти пакеты либо вручную через менеджера пакетов, опять-таки если этот менеджер пакетов присутствует в контейнере.
docker run -it --name some-alpine alpine:latest sh
/ # curl
sh: curl: not found
/ # apk add curl
/ # curl
curl: try 'curl --help' or 'curl --manual' for more information
Но если вы столкнулись с unable to start container process: exec: "bash" то просто попробуйте сменить bash на sh.
docker run -it --name some-alpine alpine:latest bash
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown.
docker run -it --name some-alpine alpine:latest sh
/ #


Комментарии