Как зайти в контейнер
docker exec -it web bashweb — имя или идентификатор контейнера (список — docker ps). Откроется терминал внутри контейнера, выход — exit или Ctrl+D. Контейнер после выхода продолжает работать.
Если bash нет
В маленьких образах, особенно на основе Alpine (теги alpine), bash не установлен. Ошибка будет примерно такой:
exec: "bash": executable file not found in $PATHТогда запускайте sh — он есть почти везде:
docker exec -it web shВ совсем минимальных образах (собранных FROM scratch, «distroless») нет даже sh — зайти в них нельзя, остаётся смотреть логи и копировать файлы через docker cp.
Разбор команды
exec— запустить ещё одну программу в уже работающем контейнере;-i— держать ввод открытым,-t— дать терминал; вместе-itнужны для интерактивной работы;- после имени контейнера — что запустить.
Одна команда без терминала
Ключи -it не нужны, если просто выполнить команду и увидеть результат:
docker exec web ls -l /usr/share/nginx/html
docker exec web cat /etc/os-release
docker exec db psql -U postgres -c 'SELECT now();'Под root или другим пользователем
Команда в exec запускается от того же пользователя, что и основная программа контейнера. Если образ работает не от root, а вам нужно поставить пакет или поправить файл, укажите пользователя:
docker exec -it -u root app shВ Docker Compose
В папке проекта — по имени сервиса, ключи -it не нужны:
docker compose exec wordpress bashПодводные камни
- Контейнер должен работать. В остановленный контейнер
execне зайдёт — Docker ответит, что контейнер не запущен. Запустите его (docker start web) или, если он сразу падает, читайте логи:docker logs web. Чтобы покопаться в файлах образа, запустите отдельный одноразовый контейнер:docker run -it --rm образ sh. - Изменения внутри не сохраняются. Всё, что вы поставили или поменяли через
exec, пропадёт при пересоздании контейнера. Постоянные изменения вносят в Dockerfile, настройки — в подключённые файлы или тома. docker attach— это другое. Он подключается к основной программе контейнера, а не открывает новый терминал;Ctrl+Cв нём может остановить сам контейнер. Для работы внутри используйтеexec.- Привычных программ нет. В образах нет
nano,ping,curlи многого другого. Можно поставить на время (apt-get update && apt-get install -y nanoв образах на Debian и Ubuntu,apk add nano— на Alpine), но после пересоздания контейнера их снова не будет.