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

▶︎ 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 example/rng:latest -f Dockerfile .

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

docker images | grep 'example/rng'

example/rng                 latest    e2e071899652   22 minutes ago   871MB

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

docker run example/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 example/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

관련 글

지식 공유2분 읽기

[Docker] 컨테이너(Container)에 할당되는 CPU 제한하기

개요 이번 게시글에서는 도커 컨테이너에서 CPU를 최적으로 활용하는 방법에 대해서 기록해보려고 한다. 호스트 CPU Core 정보 확인 먼저 컨테이너에 CPU를 최적으로 할당하기 위해서는, 현재 호스트 시스템의 CPU 정보에 대해서...

도커
지식 공유1분 읽기

[Docker] 배그 최고급 꾸러기 시뮬레이터 배포

개요 최고급 꾸러미에 대한 확률 체감을 위한 시뮬레이터 프로그램을 구현하고 도커로 배포하였음. 배포 로직은 AWS EC2 인스턴스에 도커를 사용하여 nginx proxy manager를 배포하고 리버스 프록시로 홈 서버에 있는 시뮬레...

도커