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

Привет, %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и пересборку.
На этом все!
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат , а так же подписывайся на канал .
О способах отблагодарить автора можно почитать на странице “Донаты ”.