아래의 파이썬 코드는 인풋값을 받도록 되어있다. 도커에서 아래와 같은 인풋값을 받기 위해서는 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 플래그를 주었다면 이를 기억하고 있기 때문에 따로 다시 입력해줄 필요가 없다.