Как зайти в Docker-контейнер и выполнить команду внутри

Edit...
howto
Illustrated by Igan Pol

Привет, %username%! Я с недавних пор начал изучать контейнеризацию на базе Docker. И вот в определенный момент мне понадобилось подправить пару файлов внутри готового и запущенного контейнера gitlab. Оказалось это делается довольно просто.

🔄 Обновлено 2026-05-29. Добавил шпаргалку, варианты для Alpine (sh вместо bash), вход под root и тонкие места про сохранение правок. Всё актуально для Docker 20.10+ и Compose v2.

Для того, чтобы выполнять команды внутри контейнера, надо для начала в него попасть. Для моих нужд достаточно одной простой команды. Но перед тем как попасть в контейнер, нам необходимо получить ID необходимого контейнера. Делается это командой:

docker ps

После получения списка всех запущенных контейнеров, мы выбираем (в первом столбце) ID нужного нам контейнера и подставляем в следующую команду вместо <container_id>:

docker exec -it <container_id> bash

Данная команда в контейнере <container_id> запустит bash прямо в вашей консоли. После чего, можно выполнять внутри контейнера все правки, которые нам необходимы.

Что с этим делать на практике#

Короткий набор команд под частые ситуации:

# список запущенных контейнеров (берём ID или имя из вывода)
docker ps

# зайти внутрь интерактивной оболочкой
docker exec -it <container_id> bash

# если в образе нет bash (Alpine и прочие минимальные образы) — есть sh
docker exec -it <container_id> sh

# можно обращаться по имени контейнера, а не по ID
docker exec -it gitlab bash

# выполнить одну команду, не заходя внутрь
docker exec <container_id> cat /etc/nginx/nginx.conf

# зайти под root, если внутри непривилегированный пользователь
docker exec -u 0 -it <container_id> bash

Флаги -i и -t почти всегда идут вместе: -i держит STDIN открытым, -t подсовывает псевдо-терминал. Без них docker exec отработает команду и сразу выйдет — это как раз то, что нужно для разовых команд, и не нужно для интерактивной сессии.

Если только начинаешь с Docker — загляни в основы: Dockerfile и docker-compose .

Тонкие места, на которых легко споткнуться#

  • Правки внутри контейнера не переживут пересоздание. Поправил файл руками, а потом сделал docker compose up -d --force-recreate или пересобрал образ — изменения исчезли. Контейнер эфемерен by design.
  • docker commit — это хак, а не способ деплоя. Закоммитить работающий контейнер в образ можно (docker commit <id> myimage:fix), и иногда это спасает в 3 часа ночи. Но правильный путь — поправить Dockerfile/конфиг и пересобрать, иначе через неделю никто (включая тебя) не вспомнит, что за магия зашита в этот образ.
  • Для постоянных правок конфигов есть volume и bind-mount. Если файл нужно менять регулярно — пробрасывай его через volumes в docker-compose.yml, тогда он живёт на хосте и переживает любые пересборки.
  • Нет bash — не паникуй. Минимальные образы (Alpine, distroless) идут без bash, иногда вообще без шелла. Для Alpine — sh, в distroless заходить нечем, отлаживай через docker logs и пересборку.

На этом все!


Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат , а так же подписывайся на канал .

О способах отблагодарить автора можно почитать на странице “Донаты ”.