Docker Compose:深入理解 docker compose exec 指令
更新日期: 2025 年 3 月 13 日
本文為 Docker 指令細談,第 3 篇:
- 一張圖搞懂 Docker 常見語法:從零開始理解映像檔、容器與 Dockerfile
- 初學者指南:Docker 服務 (Service) 與容器 (Container) 的區別
- Docker Compose:深入理解 docker compose exec 指令 👈進度
- Django 爬蟲自動化:Docker 獨立運行 scraper.py
- 新手指南:如何設定 WSL 2(Ubuntu 20.04)並整合 Docker
- 時區資料庫(tzdata)是什麼?完整介紹與應用指南
在使用 Docker Compose 來管理多個容器時,經常會遇到需要進入某個運行中的容器來執行指令的情境,例如檢查設定、測試指令、或是手動調整某些服務的行為。
這時候,docker compose exec
就是一個非常重要的指令。它允許你直接在已經運行的容器中執行命令,類似於 SSH 連線到遠端伺服器的概念,但這是針對本機或伺服器上的 Docker 容器。
這篇文章將詳細介紹 docker compose exec
的用途、使用方式、適用場景,以及與其他類似指令的差異。
docker compose exec
是什麼?
docker compose exec
指令的主要作用是在正在運行的容器內執行指定的指令,而不需要重新啟動容器或修改 docker-compose.yml
。
其基本語法如下:
docker compose exec <服務名稱> <指令>
<服務名稱>
:對應docker-compose.yml
中定義的服務名稱,而不是容器 ID。<指令>
:要在容器內執行的指令,例如bash
、sh
、ls
、cat
等。
docker compose exec
的基本用法
進入容器的互動式 Shell
如果想要進入某個容器的命令列,最常見的方式是啟動 bash
或 sh
:
docker compose exec <服務名稱> bash
或是:
docker compose exec <服務名稱> sh
這會打開一個 Shell 終端,讓你可以像進入一般 Linux 伺服器一樣操作容器內部環境。
範例: 假設 docker-compose.yml
中有一個名為 web
的服務,我們可以使用以下指令進入該容器:
docker compose exec web bash
如果該容器的系統不支援 bash
(例如 Alpine Linux),則改用 sh
:
docker compose exec web sh
在容器內執行特定指令
如果你只是想要單次執行某個指令,不需要進入互動模式,也可以直接附加指令,例如:
docker compose exec web ls /var/www
這會在 web
服務的容器內執行 ls /var/www
,列出 /var/www
目錄下的所有檔案。
再舉個例子,如果想要在 db
服務的 MySQL 容器內執行 SQL 查詢:
docker compose exec db mysql -u root -p
這會開啟 MySQL 命令列介面,讓你輸入密碼後登入 MySQL 伺服器。
docker compose exec
與 docker compose run
的區別
很多初學者會把 docker compose exec
和 docker compose run
混淆,這裡列出它們的關鍵差異:
指令 | 是否需要容器已在運行 | 容器狀態 | 適用情境 |
---|---|---|---|
docker compose exec | ✅ 需要 | 使用現有的運行中容器 | 在現有容器內執行指令,例如 bash |
docker compose run | ❌ 不需要 | 啟動一個新的臨時容器 | 測試新的指令或程式,不影響現有容器 |
簡單來說:
docker compose exec
適用於現有容器,你想要進去操作它或執行指令。docker compose run
則是啟動一個新的臨時容器來執行某個命令。
進階應用
使用 -T
參數避免輸出錯誤
當 docker compose exec
透過某些腳本或 CI/CD 自動化執行時,可能會遇到 the input device is not a TTY
的錯誤。此時可以加上 -T
來關閉 TTY:
docker compose exec -T web ls /app
在特定使用者身分下執行
有時候,你可能需要用特定使用者的身分來執行指令,而不是以 root 權限運行。例如,在 web
服務內以 www-data
身分執行:
docker compose exec -u www-data web whoami
這會輸出:
www-data
直接在容器內執行單行 Python、Node.js 或其他腳本
如果你的容器內有 Python 或 Node.js 環境,你可以直接執行單行程式碼:
docker compose exec web python -c "print('Hello from Docker')"
或是:
docker compose exec web node -e "console.log('Hello from Node.js in Docker')"
docker compose exec
的常見應用場景
偵錯與測試
當你的應用發生錯誤時,你可以進入容器內部來查看日誌、環境變數或手動執行程式:
docker compose exec web tail -f /var/log/nginx/access.log
這會持續顯示 Nginx 的存取日誌,幫助你分析流量或錯誤訊息。
操作資料庫
在開發環境中,你可能需要直接連線到資料庫來手動查詢資料:
docker compose exec db mysql -u root -p
或者如果你使用 PostgreSQL:
docker compose exec db psql -U postgres
安裝額外的工具
有時候,你可能需要在容器內部手動安裝一些工具:
docker compose exec web apt-get update && apt-get install vim -y
這樣你就可以在容器內使用 vim
來編輯設定檔。
結語
docker compose exec
是一個非常實用的指令,它讓你能夠直接在運行中的容器內執行指令,無論是進行偵錯、手動操作應用程式、查詢日誌,甚至是管理資料庫,都非常方便。
什麼時候使用 docker compose exec
?
✅ 你需要在現有容器內執行指令時
✅ 你想要開啟 Shell 來操作容器
✅ 你要偵錯應用程式或檢查日誌
✅ 你需要手動安裝工具或調整設定
透過 docker compose exec
,你可以更靈活地管理 Docker 容器,提高開發效率與偵錯能力!