Profile picture

[Docker] 인터렉티브(Interactive) 모드로 들어가기

JaehyoJJAng2022년 03월 30일

▶︎ Interactive mode

도커를 사용하면 대화형 모드에서 컨테이너를 실행할 수 있다.

이는 컨테이너가 실행 중인 동안 컨테이너 내에서 명령을 실행할 수 있음을 의미한다.

컨테이너를 대화식으로 사용하면 실행 중인 컨테이너 내부의 명령 프롬프트에 접근이 가능하다.

옵션 설명
-i,--interactive 표준 입력(stdin)을 활성화하며, 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지함.보통 이 옵션을 사용하여 bash에 명령을 입력
-a,--attach 컨테이너에 표준 입력(stdin),표준 출력(stdout),표준 에러(stderr)를 연결함

▶︎ Attached mode

Attached mode에서 Docker는 컨테이너에서 프로세스를 시작하고 콘솔을 프로세스의 표준 입력, 표준 출력 및 표준 오류에 연결할 수 있습니다.

▶︎ Detached mode

컨테이너가 입력 또는 출력 스트림에 연결되지 않고 백그라운드에서 실행됨을 의미합니다.

▶︎ Example

아래의 파이썬 코드는 인풋값을 받도록 되어있다.

from random import randint

min_number : int = int(input('Please enter the min number: '))
max_number : int = int(input('Please enter the max number: '))

if (max_number < min_number):
    print('Invalid input - shutting down ...')
else:
    rnd_number : int = randint(min_number,max_number)
    print(rnd_number)

먼저 위 스크립트를 도커 컨테이너에서 실행하기 위하여 아래처럼 도커파일을 생성한 후 이미지를 빌드해보자.


Dockerfile

FROM python:latest

WORKDIR /app

COPY . /app

CMD ["python","rng.py"]

build

docker build --tag yshrim12/rng:latest -f Dockerfile .

이미지가 정상적으로 생성되었는지 확인해보자

docker images | grep 'yshrim12/rng'

yshrim12/rng                 latest    e2e071899652   22 minutes ago   871MB

위 처럼 만들어진 이미지를 기반으로 아래 명령어를 사용하여 컨테이너를 실행해보자

docker run yshrim12/rng:latest

도커 컨테이너를 실행하니 아래와 같은 오류가 발생하였다.

Please enter the min number: Traceback (most recent call last):
  File "/app/rng.py", line 3, in <module>
    min_number : int = int(input('Please enter the min number: '))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
EOFError: EOF when reading a line

이는 컨테이너가 실행될 때 인풋을 받을 수 없는(터미널 입력이 불가능한) 상태이기 때문에 발생하는 에러인 것이다.

위 문제를 해결하기 위해서는 아래의 옵션이 필요하다


  • -i , --interactive : 표준 입력 활성화 및 attach 되어 있지 않더라도 표준 입력을 유지함
  • -t, --tty : TTY 모드를 할당. bash를 사용하기 위해서는 해당 옵션을 꼭 넣어주어야 한다.이 옵션을 설정하지 않으면 명령어 입력이 가능한 상태는 되지만 shell 이 표시되지는 않는다.

위 두 플래그를 사용하여 다시 컨테이너를 생성해보자.

docker run -i -t yshrim12/rng:latest

Please enter the min number: 10
Please enter the max number: 20
17

docker start 의 명령어는 기본적으로 detach 모드이기 때문에 -a 플래그를 사용하여 attach 모드로 바꿔어준 후 -i로 interactive 모드로 들어가야 한다.

docker stop 35d538c7a5f0
docker start -a -i 35d538c7a5f0

Loading script...