docker container attach

描述將本地標準輸入、輸出和錯誤流附加到執行中的容器
用法docker container attach [OPTIONS] CONTAINER
別名
docker attach

描述

使用 docker attach 將您終端的標準輸入、輸出和錯誤(或三者的任意組合)透過容器 ID 或名稱附加到正在執行的容器。這使您可以檢視其輸出或互動式地控制它,就像命令直接在您的終端中執行一樣。

注意

attach 命令顯示容器的 ENTRYPOINTCMD 程序的輸出。這可能看起來像是 attach 命令掛起了,而實際上程序可能只是在那時沒有寫入任何輸出。

您可以從 Docker 主機上的不同會話同時多次附加到同一個容器程序。

要停止容器,請使用 CTRL-c。此組合鍵向容器傳送 SIGKILL。如果 --sig-proxy 為 true(預設值),CTRL-c 會向容器傳送 SIGINT。如果容器是在 -i-t 選項下執行的,您可以使用 CTRL-p CTRL-q 組合鍵從容器中分離並使其保持執行狀態。

注意

在容器內作為 PID 1 執行的程序在 Linux 中被特殊對待:它會忽略任何具有預設操作的訊號。因此,除非程式碼中進行了處理,否則程序不會因 SIGINTSIGTERM 而終止。

當附加到啟用了 TTY 的容器(使用 -i-t 選項)時,您無法重定向 docker attach 命令的標準輸入。

當客戶端透過 docker attach 連線到容器的 stdio 時,Docker 使用大約 1MB 的記憶體緩衝區來最大化應用程式的吞吐量。一旦此緩衝區已滿,API 連線的速度就會受到影響,因此這會影響輸出程序的寫入速度。這與其他應用程式(如 SSH)類似。因此,不建議在緩慢的客戶端連線上以互動模式執行生成大量輸出的效能關鍵型應用程式。相反,請使用 docker logs 命令訪問日誌。

選項

選項預設值描述
--detach-keys覆蓋分離容器的鍵序列
--no-stdin不附加 STDIN
--sig-proxytrue將所有接收到的訊號代理到程序

示例

附加和分離執行中的容器

以下示例啟動一個以分離模式執行 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 符號)
  • [(左括號)
  • \\(兩個反斜槓)
  • _(下劃線)
  • ^(插入符)

這些 actrl-aXctrl-\\ 值都是有效組合鍵的示例。要為所有容器配置不同的預設組合鍵,請參閱配置檔案部分