docker exec

Uruchamia polecenie w działającym kontenerze.

docker exec uruchamia nowe polecenie wewnątrz już działającego kontenera. To Twoje główne narzędzie, gdy chcesz „wejść do środka” zdebugować coś na żywo, sprawdzić logi w nietypowym miejscu albo wyklikać szybkiego SQL-a bez restartu usługi. Kluczowe słowo: działającego — jeśli kontener jest zatrzymany, exec nic nie da (do tego masz docker run). Polecenie startuje jako osobny proces obok głównego procesu kontenera (PID 1) i nie wpływa na jego cykl życia.

Składnia i najważniejsze opcje

Podstawa wygląda tak: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

  • -i, --interactive — trzyma otwarte STDIN, nawet gdy nie jest podłączone. Niezbędne, gdy chcesz coś wpisywać.
  • -t, --tty — przydziela pseudo-terminal (TTY). W parze z -i daje normalną, interaktywną powłokę.
  • -d, --detach — uruchamia polecenie w tle i od razu zwalnia terminal.
  • -u, --user — wykonuje jako konkretny użytkownik, np. -u root albo -u 1000:1000.
  • -w, --workdir — ustawia katalog roboczy dla polecenia.
  • -e, --env — wstrzykuje zmienną środowiskową; --env-file wczytuje je z pliku.
  • --privileged — daje poleceniu rozszerzone uprawnienia (ostrożnie).

Przykłady użycia

  • docker exec -it moja-app bash — otwiera interaktywną powłokę bash w kontenerze moja-app. Najczęstszy scenariusz „wejdę i zobaczę”.
  • docker exec -it db sh — to samo, ale gdy w obrazie nie ma basha (alpine), używasz lżejszego sh.
  • docker exec -u root -it web bash — wchodzisz jako root, gdy domyślny użytkownik nie ma uprawnień do instalacji pakietów czy edycji plików.
  • docker exec db psql -U postgres -c "SELECT now();" — odpala pojedyncze polecenie i zwraca wynik bez wchodzenia do powłoki.
  • docker exec -w /var/log app tail -n 50 app.log — uruchamia polecenie w wskazanym katalogu roboczym.

Częste błędy i pułapki

  • Brak -it — powłoka odpalona bez -it natychmiast się zamknie albo nie przyjmie wpisywanych znaków. Zapamiętaj parę -it przy każdej interaktywnej sesji.
  • „executable file not found” — to znaczy, że w obrazie nie ma danego polecenia. Minimalne obrazy (alpine, distroless) często nie mają basha ani nawet sh. Wtedy spróbuj sh albo zainstaluj narzędzie.
  • Kontener musi działaćexec nie wskrzesi zatrzymanego kontenera. Sprawdź stan przez docker ps; jeśli go tam nie ma, kontener nie żyje.
  • Zmiany bywają ulotne — to, co zainstalujesz przez exec, zniknie po odtworzeniu kontenera. Trwałe rzeczy wpisuj do Dockerfile, nie klikaj ręcznie.
  • Kolejność flag — opcje idą przed nazwą kontenera. Wszystko po nazwie to już polecenie i jego argumenty, nie flagi Dockera.

Powiązane komendy: docker run, docker attach, docker ps, docker logs, docker cp, kubectl exec.