WSL, Docker + Python logger - IOError: [Errno 2] Нет такого файла или каталога - PullRequest
0 голосов
/ 18 ноября 2018

Запуск Docker для Windows (версия 18.06.1-ce-win73 (19507))

Вызов приложения с поддержкой поведения (среда тестирования Python) с использованием файла docker compose:

version: "3"
services:
    behave:
        build:
            context: .
        environment:
            NODE_ENV: test
            DB_DATABASE: testdb
        volumes:
            - ".:/app"
        command:
            - bash
            - run_test.sh
            - docker
            - --capture
            - --stop
            - ${FEATURE:-feature}/
            - ${TAGS}
        network_mode: host

Dockerfile довольно ванильный:

FROM ubuntu:16.04
RUN apt-get update       \
    && apt-get -y upgrade       \
    && apt-get -y install build-essential software-properties-common curl bzip2 libfreetype6 libfontconfig wget libcurl4-openssl-dev
RUN cd /usr/local/share \
    && wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2 \
    && tar xjf phantomjs-1.9.7-linux-x86_64.tar.bz2 \
    && ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/local/share/phantomjs \
    && ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs \
    && ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/bin/phantomjs
RUN apt-get -y install python python-dev python-setuptools python-pycurl python-tz python-pymongo python-cffi python-openssl python-pip
ADD . /app
RUN cd /app \
    && apt-get -y install python-httplib2 \
    && pip install -r requirements.txt \
    && python -m easy_install --upgrade pyOpenSSL
WORKDIR /app
ENV HOME=/app

В приложении для себя я использую стандартную запись в python:

fileHandler = logging.FileHandler(BASEDIR + "logs/" + name + ".log", mode='w')
fileHandler.setLevel(flevel)
fileHandler.setFormatter(logFormatter)
rootLogger.addHandler(fileHandler)

В Linux работает нормально.И он также работает нормально в WSL напрямую (т.е. не через докер).

Ошибка:

File "/app/testlib/log_helpers/__init__.py", line 55, in get_dual_logger
    fileHandler = logging.FileHandler(BASEDIR + "logs/" + name + ".log", mode='a')
File "/usr/lib/python2.7/logging/__init__.py", line 913, in __init__
    StreamHandler.__init__(self, self._open())
File "/usr/lib/python2.7/logging/__init__.py", line 944, in _open
    stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: '/app/logs/behave.log'

Чтобы попытаться увидеть, было ли что-то странное, я добавил простую печатьоператор в /usr/lib/python2.7/logging/__init__.py, прежде чем он откроет файл.Когда начинается мой тест, он печатает:

Opening /app/logs/behave.log with: a
Opening /app/logs/behave.log with: a

до сбоя (поэтому первое открытие работает, второе не удается).

Если я обновляю свой регистратор, чтобы всегда записывать в уникальный файл скод, подобный следующему:

while os.path.exists(BASEDIR + "logs/" + name + ".log"):
    name += "_"
fileHandler = logging.FileHandler(BASEDIR + "logs/" + name + ".log", mode='a')
...

, тогда он работает нормально.

Opening /app/logs/behave.log with: a
Opening /app/logs/behave_.log with: a
Opening /app/logs/behave__.log with: a
Opening /app/logs/behave___.log with: a
Opening /app/logs/behave____.log with: a
Opening /app/logs/behave_____.log with: a
Opening /app/logs/behave______.log with: a
Opening /app/logs/behave_______.log with: a
Opening /app/logs/behave________.log with: a
Opening /app/logs/behave_________.log with: a
Opening /app/logs/behave__________.log with: a
Opening /app/logs/behave___________.log with: a
Opening /app/logs/behave____________.log with: a

Итак, суть проблемы - стандартная команда python библиотеки (в logger.py):

stream = open(self.baseFilename, self.mode)

Независимо от того, использую ли я режим "w" или "a", во второй раз, когда python открывает файл журнала внутри docker-контейнера, работающего на WSL, это не получается.

Кто-нибудь когда-нибудь видел что-нибудь подобное в WSL?Любой обходной путь?

Кажется очень, очень специфичным для моего варианта использования, не уверен, известно ли это или нет

...