目錄

docker exec 指令:在執行中的容器內執行指令

docker exec 在一個執行中的容器裡執行指令,最常用來進入容器檢查問題。除錯的完整流程見 查看日誌與除錯。

語法

docker exec [參數] 容器 指令 [引數...]
docker exec -it web sh        # 進入容器的 shell
docker exec web nginx -t      # 執行一個指令並取得結果

參數

docker exec 的參數不多,以下是 docker exec --help 列出的全部參數:

參數說明
-i, --interactive保持標準輸入開啟,可以輸入內容
-t, --tty配置一個終端機。互動操作時和 -i 一起用:-it
-u, --user 使用者[:群組]以指定的使用者(名稱或 UID)執行
-w, --workdir 路徑在容器內的指定目錄執行
-e, --env 名稱=值設定這次執行的環境變數
--env-file 檔案從檔案讀取環境變數
-d, --detach在背景執行,指令立刻返回
--privileged給這個指令額外的權限(除錯用,平常不要使用)
--detach-keys修改離開的快捷鍵(預設 Ctrl+P、Ctrl+Q)

以下範例都對一個名為 web 的 nginx 容器執行,它啟動時設定了環境變數 APP_MODE=demo:

docker run -d --name web -e APP_MODE=demo nginx:1.30-alpine

執行一個指令

$ docker exec web nginx -v
nginx version: nginx/1.30.5

$ docker exec web sh -c "ls /etc/nginx/conf.d && echo \$APP_MODE"
default.conf
demo
  • 第一個指令在容器中執行 nginx -v,結果直接印出來。
  • 要使用 &&、管線、變數時,用 sh -c "..." 交給容器內的 shell 處理。\$APP_MODE 中的 \ 讓主機的 shell 不要先替換變數,demo 是容器內的值。

互動式進入容器

docker exec -it web sh

進入後提示字元變成 / #,可以像在一般 Linux 中操作,輸入 exit 離開,容器不會停止。如果映像檔有 bash,也可以用 bash。

-u、-w、-e

$ docker exec -u nginx web id
uid=101(nginx) gid=101(nginx) groups=101(nginx)

$ docker exec -w /usr/share/nginx/html web ls
50x.html
index.html

$ docker exec -e GREETING=hi web sh -c "echo \$GREETING"
hi
  • -u nginx:以 nginx 使用者執行(容器預設是 root)。檢查檔案權限問題時很有用。
  • -w /usr/share/nginx/html:在指定的目錄執行,相當於先 cd。
  • -e GREETING=hi:只對這次執行設定環境變數,不會改變容器本身。

-d:在背景執行

$ docker exec -d web sh -c "sleep 2; touch /tmp/done"

$ docker exec web ls /tmp
done

-d 讓指令在背景執行並立刻返回,2 秒後檢查,/tmp/done 已經建立。適合啟動不需要等待結果的工作。

容器沒有在執行

$ docker stop web
web

$ docker exec web ls
Error response from daemon: container 1ec4fdc5c592b09b64e8f28869c37f89ab17163f88bfcb09e82815a44b0e1164 is not running

docker exec 只能用在執行中的容器。已停止的容器要先 docker start;容器一啟動就退出的話,exec 也進不去,要改看 docker logs,或用 docker run --rm -it --entrypoint sh 映像檔 啟動一個新容器檢查。

相關章節

動手練習

練習:用一個指令,以 nginx 使用者的身分,在 web 容器的 /etc/nginx 目錄中列出檔案。

答案
docker exec -u nginx -w /etc/nginx web ls

常見問題

docker exec 和 docker run 有什麼不同?

docker run 用映像檔**建立一個新容器**;docker exec 在**已經在執行的容器**中多執行一個程序。exec 結束不會影響容器本身。

docker exec -it 容器 bash 出現 executable file not found?

容器裡沒有 bash,例如 Alpine 為基礎的映像檔只有 sh。改成 docker exec -it 容器 sh。

在容器裡修改的檔案,重建容器後還在嗎?

不在。用 exec 修改的是容器的可寫層,刪除容器就消失了。需要保留的改動要寫進 Dockerfile,或放在 Volume 中。

更新於 2026年10月14日