Приложение Django на docker. Проблема с travis и logger
Давным-давно я добавил модуль логирования в свое приложение django. Мое приложение работает локально нормально. Проблема заключается в Travis CI. Travis не справляется со сборкой, выдавая ошибку FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/electronic_shop/_logs/data.log': Travis building. Как я понимаю, у Travis возникла проблема с поиском файла _logs/data.log. Сначала я думал, что достаточно добавить новую команду в мой файл докера (mkdir /electronic_shop/_logs), но я ошибся. Итак, вопрос в том, что я могу сделать, чтобы заставить Travis запустить мой образ? Docker создает папку _log внутри моего образа, поэтому ошибки быть не должно. Есть идеи? Должен ли я создавать файлы, необходимые для логгера, вручную (в файле докера)?
Вот мой файл docker:
FROM python:3.10-alpine
EXPOSE 8000
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache postgresql-client jpeg-dev
RUN apk add --update --no-cache --virtual .tmp-build-deps \
gcc libc-dev linux-headers postgresql-dev musl-dev zlib zlib-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp-build-deps
RUN mkdir /electronic_shop
RUN mkdir /electronic_shop/_logs
WORKDIR /electronic_shop
COPY . /electronic_shop
RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static
RUN adduser -u 5678 --disabled-password --gecos "" user && chown -R user /electronic_shop
RUN chown -R user:user /vol/
RUN chmod -R 755 /vol/web
USER user
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "electronic_shop.wsgi"]
Трэвис:
language: python
python:
- "3.9"
services:
- docker
before_script: pip install docker-compose
script:
- docker-compose run electronicshop sh -c "python manage.py wait_for_db && python manage.py test"
settings.py с looger:
def logging_structure(logfile_name):
return {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {
"format": "[%(asctime)s] %(levelname)s [%(pathname)s:%(lineno)s] %(message)s",
"datefmt": "%d/%b/%Y %H:%M:%S",
},
"simple": {"format": "%(levelname)s %(message)s"},
},
"handlers": {
"profile": {
"level": "DEBUG",
"class": "logging.FileHandler",
"filename": os.path.join(logfile_name, "profiles.log"),
"formatter": "verbose",
},
"data": {
"level": "DEBUG",
"class": "logging.FileHandler",
"filename": os.path.join(logfile_name, "data.log"),
"formatter": "verbose",
},
"django": {
"level": "DEBUG",
"class": "logging.FileHandler",
"filename": os.path.join(logfile_name, "django.log"),
"formatter": "verbose",
},
"project": {
"level": "DEBUG",
"class": "logging.FileHandler",
"filename": os.path.join(logfile_name, "project.log"),
"formatter": "verbose",
},
"route_updater": {
"level": "DEBUG",
"class": "logging.FileHandler",
"filename": os.path.join(logfile_name, "route.updater.log"),
"formatter": "verbose",
},
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "simple",
},
},
"loggers": {
"profiles": {
"handlers": ["console", "profile"],
"level": "DEBUG",
},
"django": {
"handlers": ["django"],
"propagate": True,
"level": "ERROR",
},
"project": {
"handlers": ["project"],
"level": "DEBUG",
},
"route_updater": {
"handlers": ["console", "route_updater"],
"level": "DEBUG",
},
},
}
LOGGING_CONFIG = None
LOGGING = logging_structure("_logs")
logging.config.dictConfig(LOGGING)
logger = logging.getLogger(__name__)