docker-compose mysql 연결할때 error

HYEYOON·2021년 7월 5일
1


Docker-compose로 DB와 Django를 띄우려 하는데...
나를 계속 열받게 했던 에러..

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

DB컨테이너와 장고 컨테이너가 연동이 되면, 장고앱의 models.py에서 작성하여 migrate한 내용이 DB에도 동일하게 반영이 된다. 그러면서 이 ERROR가 뜨게되는데..

이는 DB컨테이너가 준비가 끝나기 전에 장고 컨테이너가 실행되서 그런것이다. DB 컨테이너 준비가 완료되어야 장고에서 정상적으로 연결할 수 있는데 그렇지 않기 때문에 에러가 발생하는 것이다.
따라서 장고 컨테이너가 DB컨테이너 준비가 끝날때까지 대기하는 과정이 필요하다.

다양한 방법이 있지만, 나는 dockerize를 사용해봤다.
dockerize는 도커 컨테이너들의 관리를 돕는 일종의 util이다.

DockerFile

도커파일에 아래를 추가해줬다.

ENV DOCKERIZE_VERSION v0.6.1

RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
    
RUN ["chmod", "+x", "./docker-entrypoint.sh"]

ENTRYPOINT ["./docker-entrypoint.sh"]

컨테이너를 시작할때 docker-entrypoint를 지정해줬다.

그리고 docker-entrypoint.sh라는 쉘스크립트를 생성해줬다.

#!/bin/bash
#해당 명령은 dockerize를 이용해 mysql_service 컨테이너의 3306포트에 20초동안 tcp연결을 걸며 대기하는 명령어이다. 
dockerize -wait tcp://db:3306 -timeout 20s


echo "Apply database migrations"
python manage.py migrate

echo "Starting django server"
python manage.py runserver 0.0.0.0:8000

이렇게 설정했더니 장고 컨테이너가 먼저 실행되더라도 DB컨테이너 준비가 끝나서 포트가 열리기 전까지는 20초동안 대기하기 떄문에 디비에 연결을 실패해 컨테이너가 종료되는 불상사는 발생하지 않는다. 오예..

profile
Back-End Developer🌱

0개의 댓글