docker container attach
說明 | 將本機的標準輸入、輸出和錯誤串流連接到正在執行的容器 |
---|---|
用法 | docker container attach [選項] 容器 |
別名 | docker attach |
說明
使用 docker attach
命令,透過容器的 ID 或名稱,將終端機的標準輸入、輸出和錯誤(或三者的任意組合)連接到正在執行的容器。這讓您可以檢視其輸出或以互動方式控制它,就像命令直接在終端機中執行一樣。
**注意**
attach
命令會顯示容器的ENTRYPOINT
和CMD
處理程序的輸出。當處理程序可能只是在該時間點沒有寫入任何輸出時,這可能會讓您覺得 attach 命令卡住了。
您可以從 Docker 主機上的不同工作階段,同時多次連接到同一個容器處理程序。
要停止容器,請使用 CTRL-c
。此按鍵順序會將 SIGKILL
信號傳送到容器。如果 --sig-proxy
為 true(預設值),則 CTRL-c
會將 SIGINT
信號傳送到容器。如果容器是使用 -i
和 -t
選項執行的,您可以使用 CTRL-p CTRL-q
按鍵順序與容器分離,並讓它繼續執行。
**注意**
在容器內以 PID 1 執行的處理程序會被 Linux 特殊處理:它會忽略任何具有預設動作的信號。因此,除非程式碼中有特別設定,否則處理程序不會在收到
SIGINT
或SIGTERM
信號時終止。
當您附加到已啟用 TTY 的容器(使用 -i
和 -t
選項)時,無法重新導向 docker attach
命令的標準輸入。
當客戶端使用 docker attach
連接到容器的 stdio
時,Docker 會使用約 1MB 的記憶體緩衝區來最大化應用程式的吞吐量。一旦此緩衝區已滿,API 連線的速度就會受到影響,因此這會影響輸出程序的寫入速度。這類似於 SSH 等其他應用程式。因此,不建議透過慢速客戶端連線在前台執行會產生大量輸出的效能關鍵型應用程式。請改用 docker logs
命令來存取日誌。
選項
選項 | 預設值 | 說明 |
---|---|---|
--detach-keys | 覆寫分離容器的按鍵順序 | |
--no-stdin | 不附加 STDIN(標準輸入) | |
--sig-proxy | true | 將所有接收到的信號代理到程序 |
範例
附加到執行中的容器並從中分離
以下範例以分離模式啟動一個執行 top
的 Alpine 容器,然後附加到該容器;
$ docker run -d --name topdemo alpine top -b
$ docker attach topdemo
Mem: 2395856K used, 5638884K free, 2328K shrd, 61904K buff, 1524264K cached
CPU: 0% usr 0% sys 0% nic 99% idle 0% io 0% irq 0% sirq
Load average: 0.15 0.06 0.01 1/567 6
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1 0 root R 1700 0% 3 0% top -b
由於容器是在沒有 -i
和 -t
選項的情況下啟動的,因此信號會轉發到附加的程序,這表示預設的 CTRL-p CTRL-q
分離按鍵順序不起作用,但按下 CTRL-c
會終止容器。
<...>
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1 0 root R 1700 0% 7 0% top -b
^P^Q
^C
$ docker ps -a --filter name=topdemo
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96254a235bd6 alpine "top -b" 44 seconds ago Exited (130) 8 seconds ago topdemo
重複上述範例,但這次設定了 -i
和 -t
選項;
$ docker run -dit --name topdemo2 alpine /usr/bin/top -b
現在,當附加到容器並按下 CTRL-p CTRL-q
(「讀取跳脫序列」)時,Docker CLI 會處理分離序列,並且 attach
命令會從容器中分離。使用 docker ps
檢查容器的狀態會顯示容器仍在背景中執行。
$ docker attach topdemo2
Mem: 2405344K used, 5629396K free, 2512K shrd, 65100K buff, 1524952K cached
CPU: 0% usr 0% sys 0% nic 99% idle 0% io 0% irq 0% sirq
Load average: 0.12 0.12 0.05 1/594 6
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1 0 root R 1700 0% 3 0% top -b
read escape sequence
$ docker ps -a --filter name=topdemo2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fde88b83c2c2 alpine "top -b" 22 seconds ago Up 21 seconds topdemo2
取得容器命令的結束代碼
在第二個範例中,您可以看到 bash
程序返回的結束代碼也由 docker attach
命令返回給其呼叫者。
$ docker run --name test -dit alpine
275c44472aebd77c926d4527885bb09f2f6db21d878c75f0a1c212c03d3bcfab
$ docker attach test
/# exit 13
$ echo $?
13
$ docker ps -a --filter name=test
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2fe3fd886db alpine "/bin/sh" About a minute ago Exited (13) 40 seconds ago test
覆寫分離序列 (--detach-keys)
使用 --detach-keys
選項覆寫 Docker 的分離按鍵順序。如果 Docker 預設序列與您用於其他應用程式的按鍵順序衝突,這會很有用。您可以透過兩種方式定義您自己的分離按鍵順序:作為每個容器的覆寫或作為整個設定的設定屬性。
要覆寫個別容器的序列,請在 docker attach
命令中使用 --detach-keys="<sequence>"
旗標。<sequence>
的格式可以是字母 [a-Z],或是 ctrl-
與以下任何一個組合:
a-z
(單個小寫字母)@
(at 符號)[
(左括號)\\
(兩個反斜線)_
(底線)^
(插入符號)
這些 a
、ctrl-a
、X
或 ctrl-\\
值都是有效按鍵序列的範例。要為所有容器設定不同的預設按鍵順序,請參閱設定檔章節。