目錄
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 映像檔 啟動一個新容器檢查。
相關章節
- 查看日誌與除錯
- docker run 參數
- docker cp:在主機與容器間複製檔案
- 常見錯誤訊息:
executable file not found、TTY 錯誤
動手練習
練習:用一個指令,以 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日