Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

nomad-programmer

[DevOps/Docker] docker-compose로 의존성이 있는 서버 구성에서의 유용한 TIP 본문

DevOps/Docker

[DevOps/Docker] docker-compose로 의존성이 있는 서버 구성에서의 유용한 TIP

scii 2020. 12. 8. 23:52

Django 서버와 DB 서버가 있다고 가정해보자. 이 서버들의 의존성은 다음과 같다.

Django 서버는 DB 서버를 내부적으로 사용하기 때문에 DB 서버가 온전하게 구동된 후 Django 서버에서 DB서버를 사용해야 한다.

그런데 docker-compose 위의 서버 구성을 작성하여 실행하게되면 DB서버가 빨리 구동되면 문제가 없겠지만 DB서버가 구동되고 있는데 Django서버가 구동되면 문제가 발생한다. 그렇다고 DB서버를 먼저 실행한 후 온전히 구동되기를 기다렸다가 Django 서버를 구동시키는 수작업은 너무 귀찮을 일이다.

이것을 해결할 수 있는 방법이 있다. 그것은 아래의 스크립트를 이용하는 것이다.

github.com/vishnubob/wait-for-it

 

vishnubob/wait-for-it

Pure bash script to test and wait on the availability of a TCP host and port - vishnubob/wait-for-it

github.com

이 쉘 스크립트는 이름이 알려주듯이 특정 서버의 특정 포트로 접근할 수 있을 때까지 기다려주는 쉘 스크립트이다. 이 스크립트를 도커 이미지 안에 넣고, 이미지 실행 명령 앞에 붙여주면 된다.

// Dockerfile-dev

ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /

그리고 docker-compose.yml 파일의 command 부분을 다음처럼 작성한다.

services:
  django:
    command:
      - bash
      - -c
      - |
        /wait-for-it.sh db:5555 -t 10
        python manage.py runserver 0:8000

이렇게 하면, DB 서비스의 5555 포트가 사용 가능할 때까지 기다린 후, Django 개발 서버가 실행되기 때문에 오류가 발생하지 않는다.


번외로 docker-compose에서 파이썬 로그가 조금 늦게 출력된다는 느낌을 받는다면 아래의 환경 변수를 적용하자.

// Dockerfile-dev

// 변수의 값이 0이든 1이든 상관 없다. 환경변수가 존재하기만 하면 된다.
ENV PYTHONUNBUFFERED=0

파이썬에서 출력 버퍼가 기본으로 작동하면서 출력 로그를 붙잡고 있기 때문에, 이 버퍼링을 없애려면 PYTHONUNBUFFERED 환경변수를 추가해주면 된다.

Comments