Docker Compose:深入理解 docker compose exec 指令

更新日期: 2025 年 3 月 13 日

在使用 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。
  • <指令>:要在容器內執行的指令,例如 bashshlscat 等。

docker compose exec 的基本用法

進入容器的互動式 Shell

如果想要進入某個容器的命令列,最常見的方式是啟動 bashsh

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 execdocker compose run 的區別

很多初學者會把 docker compose execdocker 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 容器,提高開發效率與偵錯能力!

Similar Posts