도커의 Interactive mode

dong5854·2022년 2월 10일
0

docker

목록 보기
3/8
post-thumbnail

아래의 파이썬 코드는 인풋값을 받도록 되어있다. 도커에서 아래와 같은 인풋값을 받기 위해서는 Interactive mode로 진입을 할 필요가 있다.

#rng.py
from random import randint

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

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

일단 파이썬을 도커에서 실행하기 위해 도커 이미지를 받고 해당 파일을 실행시켜주는 도커파일을 만들어 준 후 빌드해준다.

# Dockerfile

FROM python

WORKDIR /app

COPY . /app

CMD ["python", "rng.py"]
dong@ubuntu:~/docker-complete/INTERACTIVE-MODE-PRAC$ sudo docker build .
[sudo] password for dong: 
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM python
latest: Pulling from library/python
0c6b8ff8c37e: Pull complete 
412caad352a3: Pull complete 
e6d3e61f7a50: Pull complete 
461bb1d8c517: Pull complete 
808edda3c2e8: Pull complete 
724cfd2dc19b: Pull complete 
8bd4965a24ab: Pull complete 
fccd5fa208a8: Pull complete 
af1ca64a0eec: Pull complete 
Digest: sha256:a7a73f894e756267b2bac3b068e51ad50aa06f16855a9c6b208630d48937796f
Status: Downloaded newer image for python:latest
 ---> e2e732b7951f
Step 2/4 : WORKDIR /app
 ---> Running in 4a1a38c07a0e
Removing intermediate container 4a1a38c07a0e
 ---> a1aa2db4a916
Step 3/4 : COPY . /app
 ---> 4131eadfa3c2
Step 4/4 : CMD ["python", "rng.py"]
 ---> Running in 0da963428686
Removing intermediate container 0da963428686
 ---> d73c8a65c249
Successfully built d73c8a65c249

이렇게 만들어진 이미지 아이디로 도커를 실행하면 아래와 같은 오류가 발생한다.

dong@ubuntu:~/docker-complete/INTERACTIVE-MODE-PRAC$ sudo docker run  d73c8a65c249
Please enter the min number: Traceback (most recent call last):
  File "/app/rng.py", line 3, in <module>
    min_number = int(input('Please enter the min number: '))
EOFError: EOF when reading a line

이는 컨테이너가 실행될 때 인풋을 받을 수 없는 상태기 때문에 발생하는 에러인데 이 문제를 해결해줄 플래그들을 docker run --help를 사용해 확인해보면 2가지 플래그가 눈에 띈다.
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
-i 플래그는 표준 입력(stdin)을 활성화하며 컨테이너와 attach되어 있지 않더라도 표준 입력을 유지해준다.
-t 플래그는 TTY 모드(pseudo-TTY)를 할당한다. Bash를 사용하려면 이 옵션을 넣어 주어야 한다. 이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만 셸이 표시되지 않는다.

이 두 플래그를 사용해 이미지를 실행시키면 아래와 같이 에러가 없는 것을 확인할 수 있다.

dong@ubuntu:~/docker-complete/INTERACTIVE-MODE-PRAC$ sudo docker run -i -t d73c8a65c249
Please enter the min number: 1
Please enter the max number: 7
1

컨테이너를 docker start로 시작할 때는 아래에 적혀 있는 부분을 유의해야 한다.

dong@ubuntu:~/docker-complete/INTERACTIVE-MODE-PRAC$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
b2a0ac863b55   d73c8a65c249   "python rng.py"          2 minutes ago    Exited (0) 2 minutes ago              nifty_lehmann

dong@ubuntu:~/docker-complete/INTERACTIVE-MODE-PRAC$ sudo docker start -a -i nifty_lehmann
Please enter the min number: 4
Please enter the max number: 6
5

docker start로 컨테이너를 시작하면 docker start의 명령어는 기본적으로 detach 모드이기 때문에 -a 플래그로 attach 모드로 바꾸어 주고 -i로 interactive 모드로 들어가야 한다. -t 플래그는 처음에 docker run 으로 컨테이너를 실핼할 때 -t 플래그를 주었다면 이를 기억하고 있기 때문에 따로 다시 입력해줄 필요가 없다.

profile
https://github.com/dong5854?tab=repositories

0개의 댓글