본문 바로가기
Coding/DevOps

Docker Hot reload 적용하는 방법

by Hide­ 2019. 1. 8.
반응형

목적

소스의 변경이 일어나면 바로 도커 컨테이너에 적용되는 Hot reload에 대해 기술한다.



일반적으로 도커를 사용하여 개발할 때 배포환경/개발환경 두가지로 나눠서 작업한다.

배포환경에서는 큰 문제가 없지만 개발환경에서는 소스의 변경이 잦으므로 변경을 자동으로 탐지하여

변경된 내용을 반영하여 재시작해주는 플로우가 필요하다.

보통 로컬의 파일을 컨테이너에 적용하기위해 아래와 같은 코드를 사용한다. (Dockerfile)


COPY . ./home
WORKDIR home


현재 폴더를 컨테이너의 /home 디렉토리로 복사하고 해당 디렉토리로 이동하여 작업하는 형태이다.

하지만 위처럼 정의를 해버리면 한번 빌드한 컨테이너의 내용을 수정하기 까다롭다는 단점이 있다.

(직접 도커에 붙어서 수정해야하지만, 이미지를 다시 빌드하면 수정한 내용이 날라가기 때문)

이에 대해 도커는 간단한 해결책을 제시한다.

바로 volume 커맨드를 사용하여 현재 디렉토리를 컨테이너로 복사하는것이 아니라 마운트시키는 방법이다.

docker-compose.yml에 아래와 같은 라인을 추가한다.


volumes:
- $PWD:/home


위처럼 선언하면 현재 디렉토리가 컨테이너의 /home 디렉토리로 mount된다.

(로컬:컨테이너의 형태이다)


단순하게 도커에 플라스크만 올려서 사용한다면 위 방법만으로도 큰 문제가 발생하지 않지만

배포를 위해서는 얘기가 달라진다.

일반적으로 플라스크, 장고와 같은 파이썬 웹들은 Apache, Nginx와 같은 웹서버와 붙여서 배포한다.

나는 지금 Nginx + Supervisor + Uwsgi + Flask 이렇게 총 4개를 엮어서 사용하고 있다.

엮는 부분이 여러개이기 때문에 어느 부분을 설정해줘야 할지 고민이 되겠지만 해결방법은 상당히 간단하다.

uwsgi를 구동할 때 아래의 옵션을 추가해주면 된다.


--py-autoreload 1


위 옵션을 추가하여 구동하고 코드를 변경하고 저장해보면 자동으로 재시작하는 모습을 볼 수 있다.