장고 프로젝트를 도커로 배포하며 환경변수가 적용되지 않는 문제를 겪었습니다. 이 상황당시의 코드 상황은 대략 다음과 같았습니다.
# docker-compose.yml
version: "3"
services:
django:
build: .
ports:
- 80:80
env_file:
- web.env
volumes:
- ./static:/staticfiles
command: gunicorn config.wsgi --bind 0.0.0.0:80
# Dockerfile
FROM python:3.10
ENV PYTHONUNBUFFERED=0
WORKDIR /web
COPY ./requirements.txt /web
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
COPY . /web
RUN python manage.py collectstatic --noinput
CMD gunicorn config.wsgi:application --bind 0.0.0.0:80
# settings.py
import os
SECRET_KEY = os.environ.get("SECRET_KEY", "1234")
DEBUG = os.environ.get("DJANGO_DEBUG", "False") == "True"
ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS", "*").split(" ")
# web.env
DJANGO_DEBUG=False
SECRET_KEY=12345
DJANGO_ALLOWED_HOSTS=localhost
해당상황에서 계속 오류가 발생하고 있는 상황이었습니다. 문제로 의심될만한 것들은 다음과 같았습니다.
- web.env environment file이 제대로 불러와지지 않은 경우, 포맷이 잘못된 경우
- docker 내부에 환경변수가 제대로 들어가지 않은 경우
- python에서 os.environ.get()으로 환경변수를 잘 읽어내지 못하는 경우
당시에 이 3가지를 의심하고 계속 디버깅을 진행하였습니다.
.env파일과 도커파일들의 정확한 서식을 수없이 보고, 수없이 컨테이너를 빌드하고 docker-compose config로 .env의 파일은 문제가 아니다라고 배제한 후 우연히 찾아낸 오류는 의외였습니다.
Step 8/9 : RUN python manage.py collectstatic --noinput
---> Running in 4afbff0af905
Traceback (most recent call last):
File "/web/manage.py", line 22, in <module>
main()
File "/web/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 420, in execute
django.setup()
File "/usr/local/lib/python3.10/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python3.10/site-packages/django/apps/registry.py", line 116, in populate
app_config.import_models()
File "/usr/local/lib/python3.10/site-packages/django/apps/config.py", line 269, in import_models
self.models_module = import_module(models_module_name)
File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/usr/local/lib/python3.10/site-packages/rest_framework_simplejwt/models.py", line 6, in <module>
from .settings import api_settings
File "/usr/local/lib/python3.10/site-packages/rest_framework_simplejwt/settings.py", line 19, in <module>
"SIGNING_KEY": settings.SECRET_KEY,
File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 101, in __getattr__
raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
ERROR: Service 'django' failed to build: The command '/bin/sh -c python manage.py collectstatic --noinput' returned a non-zero code: 1
당시 오류 메시지를 보면 다음과 같았는데, 보면 8/9단계인 RUN으로 정적파일을 다루는 부분에서 오류가 난 것을 볼 수 있습니다. 이는 docker-compose.yml에서 넘겨준 환경변수는 최종단계에서는 제대로 전달이 되지만, 빌드단계인 8단계에서는 Docker로 들어가지 않아 collectstatic를 실행할 때는 SECRET_KEY가 지정되지 않아 오류가 나는 것이었습니다.
제대로 오류를 읽어보았다면, 빌드과정에서, 그것도 8단계에서 SECRET_KEY가 없는것의 문제인 것을 금방 알 수 있었을 텐데, 오류 코드를 제대로 읽어보지 않아 많은 시간을 낭비하게 된 경험이었습니다.
원래는 결과를 못찾으면 그냥 django-environ를 이용하여 해결할 생각이었으나, 이렇게라도 문제점을 찾았으니 다행이라고 생각합니다. 그러나 django-environ을 적용하는 게 개발 시에도 환경변수를 설정하기 더 편할듯하여 추후 django-environ은 어찌 되었던 적용하게 될 것 같습니다.
'Troubleshooting' 카테고리의 다른 글
카카오 소셜 로그인시 카카오톡 내부에서 브라우저가 켜지는 오류 (0) | 2024.02.09 |
---|---|
poetry 오류 ImportError: cannot import name 'user_data_dir' from 'platformdirs' (unknown location) (0) | 2024.02.09 |
DRF production에서 정상작동 하는데 test 통과 안되는 문제 (0) | 2023.09.21 |
장고 https적용시 CSRF에러 (0) | 2023.09.04 |
230818 Gunicorn [CRITICAL] WORKER TIMEOUT 오류 (0) | 2023.08.18 |