Каждый уважающий себя админ 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
/ #