docker compose exec uruchamia polecenie wewnątrz działającego już kontenera należącego do usługi opisanej w pliku compose.yaml. To codzienny chleb przy pracy z Compose: wskakujesz do shella, sprawdzasz logi aplikacji, odpalasz migrację bazy albo zaglądasz do procesu, zamiast za każdym razem ręcznie szukać identyfikatora kontenera. Compose sam mapuje nazwę usługi (np. db, web) na właściwy kontener, więc operujesz nazwami, które znasz z konfiguracji, a nie losowymi hashami. Kontener musi być wstał (docker compose up) — to nie jest sposób na uruchomienie usługi od zera.
Składnia i najważniejsze opcje
Podstawowa forma wygląda tak: docker compose exec [OPCJE] USŁUGA POLECENIE [ARGUMENTY...]
-d, --detach— uruchamia polecenie w tle i od razu zwraca kontrolę nad terminalem.-e, --env KLUCZ=WARTOŚĆ— ustawia zmienne środowiskowe dla uruchamianego procesu (można powtarzać).-w, --workdir KATALOG— wskazuje katalog roboczy, w którym wystartuje polecenie.-u, --user UŻYTKOWNIK— uruchamia jako podany użytkownik (np.rootalbo1000:1000).-T, --no-TTY— wyłącza alokację pseudo-TTY; potrzebne przy potokach i przekierowaniach.--index NUMER— wybiera konkretną replikę, gdy usługa ma kilka instancji (np.--index 2).--privileged— nadaje procesowi rozszerzone uprawnienia. Używaj świadomie, nie z rozpędu.
Przykłady użycia
docker compose exec web bash— otwiera interaktywny shell w kontenerze usługiweb(domyślnie jest TTY, więc działa jak normalna konsola).docker compose exec db psql -U postgres -d app— łączy się z bazą Postgres działającą w usłudzedb.docker compose exec -T db pg_dump -U postgres app > backup.sql— robi zrzut bazy do pliku na hoście;-Tjest tu kluczowe, bo bez niego przekierowanie się sypie.docker compose exec -u root web apt-get update— wykonuje polecenie jako root, nawet gdy obraz domyślnie startuje jako zwykły użytkownik.docker compose exec -e DEBUG=1 -w /app web php artisan migrate— odpala migrację w katalogu/appz dodatkową zmienną środowiskową.
Częste błędy i pułapki
Najczęstszy zgrzyt: the input device is not a TTY. Pojawia się, gdy odpalasz exec w skrypcie albo z potoku — dorzuć -T i problem znika. Pamiętaj, że Compose domyślnie alokuje TTY, w przeciwieństwie do gołego docker exec, gdzie sam dodajesz -it.
Drugi klasyk: service „X” is not running. exec wymaga wstałego kontenera — jeśli usługa zdążyła paść albo nie wystartowała, najpierw docker compose up -d. Do jednorazowego polecenia w świeżym kontenerze służy docker compose run, nie exec.
Uważaj też na --privileged i -u root — pliki utworzone jako root potrafią potem blokować twojego użytkownika hosta przez prawa własności w zamontowanych wolumenach. I nie myl starego myślnikowego docker-compose exec (Compose V1) z nowym docker compose exec (V2); składnia jest niemal identyczna, ale V1 jest już wygaszone.
Powiązane komendy: docker compose run, docker compose up, docker compose logs, docker exec, docker compose ps.