docker container attach

docker container attach

docker container attach는 실행 중인 컨테이너의 표준 입출력 스트림에 연결하는 명령이에요. 실행 중인 컨테이너의 출력을 직접 보고 싶을 때 사용해요.

출처: 문서

본문

docker container attach는 실행 중인 컨테이너의 표준 입력·출력·오류 스트림에 연결해요. docker run으로 띄운 컨테이너의 콘솔에 다시 붙고 싶을 때 유용해요.

지원하는 옵션은 다음과 같아요.

옵션 기본값 설명
--detach-keys 컨테이너에서 분리하기 위한 키 시퀀스를 덮어써요
--no-stdin STDIN을 연결하지 않아요
--sig-proxy true 받은 모든 신호를 프로세스로 프록시해요

실행 중인 컨테이너에 연결했다 분리하기

다음 예제는 top을 실행하는 Alpine 컨테이너를 detached 모드로 시작한 뒤 컨테이너에 연결해요.

$ 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 분리( detach) 키 시퀀스는 효과가 없고, 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( "read escape sequence")를 누르면, 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 (소문자 알파벳 하나)
  • @ (골뱅이)
  • [ (왼쪽 대괄호)
  • \\ (백슬래시 두 개)
  • _ (밑줄)
  • ^ (캐럿)

a, ctrl-a, X, ctrl-\\ 값이 모두 유효한 키 시퀀스 예시예요. 모든 컨테이너에 적용할 다른 기본 키 시퀀스를 구성하려면 Configuration file 섹션을 참고해요.

더 알아보기