docker container exec
| 描述 | 在執行中的容器內執行指令 |
|---|---|
| 使用方式 | docker container exec [選項] 容器 指令 [參數...] |
| 別名 | docker exec |
認識 Docker Debug
若要輕鬆取得任何容器的偵錯 Shell,請使用
docker debug。Docker Debug 是docker exec偵錯方式的替代方案。透過它,您可以進入任何容器或映像檔(甚至是輕量級映像檔)的 Shell,無需進行任何修改。此外,您還可以在其可自訂的工具箱中攜帶您喜愛的偵錯工具。立即探索 Docker Debug。
描述
docker exec 指令會在執行中的容器內執行新指令。
您使用 docker exec 指定的指令僅在容器的主要處理程序 (PID 1) 執行時才會運作,若容器重新啟動,該指令不會隨之重新啟動。
該指令會在容器的預設工作目錄中執行。
該指令必須是可執行檔。串聯或引號包覆的指令無法運作。
- 此用法有效:
docker exec -it my_container sh -c "echo a && echo b" - 此用法無效:
docker exec -it my_container "echo a && echo b"
選項
| 選項 | 預設值 | 描述 |
|---|---|---|
-d, --detach | 分離模式:在背景執行指令 | |
--detach-keys | 覆寫用於分離容器的按鍵序列 | |
-e, --env | API 1.25+ 設定環境變數 | |
--env-file | API 1.25+ 讀取環境變數檔案 | |
-i, --interactive | 即使未附加也保持 STDIN 開啟 | |
--privileged | 賦予指令擴展權限 | |
-t, --tty | 分配虛擬 TTY | |
-u, --user | 使用者名稱或 UID (格式: <名稱|uid>[:<群組|gid>]) | |
-w, --workdir | API 1.35+ 容器內的工作目錄 |
範例
在執行中的容器上執行 docker exec
首先,啟動一個容器。
$ docker run --name mycontainer -d -i -t alpine /bin/sh
這會從 alpine 映像檔建立並啟動一個名為 mycontainer 的容器,並以 sh shell 作為其主處理程序。-d 選項(--detach 的簡寫)將容器設定為在背景中以分離模式執行,並附加虛擬 TTY (-t)。設定 -i 選項以保持 STDIN 附加 (-i),這能防止 sh 處理程序立即結束。
接著,在容器上執行指令。
$ docker exec -d mycontainer touch /tmp/execWorks
這會在執行中的 mycontainer 容器內的背景中建立一個名為 /tmp/execWorks 的新檔案。
接著,在容器上執行互動式 sh shell。
$ docker exec -it mycontainer sh
這會在 mycontainer 容器中啟動一個新的 shell 工作階段。
為 exec 處理程序設定環境變數 (--env, -e)
接著,在目前的 bash 工作階段中設定環境變數。
docker exec 指令會繼承容器建立時所設定的環境變數。使用 --env (或 -e 簡寫) 來覆寫全域環境變數,或為 docker exec 啟動的處理程序設定額外的環境變數。
以下範例在 mycontainer 容器中建立一個新的 shell 工作階段,並將環境變數 $VAR_A 設為 1,$VAR_B 設為 2。這些環境變數僅對該 docker exec 指令啟動的 sh 處理程序有效,對容器內執行的其他處理程序則無法存取。
$ docker exec -e VAR_A=1 -e VAR_B=2 mycontainer env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f64a4851eb71
VAR_A=1
VAR_B=2
HOME=/root
提升容器權限 (--privileged)
設定 exec 處理程序的工作目錄 (--workdir, -w)
預設情況下,docker exec 指令會在容器建立時所設定的相同工作目錄中執行。
$ docker exec -it mycontainer pwd
/
您可以使用 --workdir 選項(或 -w 簡寫)為要執行的指令指定另一個工作目錄。
$ docker exec -it -w /root mycontainer pwd
/root
嘗試在暫停的容器上執行 docker exec
如果容器已暫停,則 docker exec 指令會失敗並出現錯誤。
$ docker pause mycontainer
mycontainer
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
482efdf39fac alpine "/bin/sh" 17 seconds ago Up 16 seconds (Paused) mycontainer
$ docker exec mycontainer sh
Error response from daemon: Container mycontainer is paused, unpause the container before exec
$ echo $?
1