Subprocess.run не работает в Docker, особенно для pdftotext (ошибка ввода-вывода, файл не найден) - PullRequest
0 голосов
/ 22 сентября 2019

Это работает локально, но не в контейнере Docker.Я пытаюсь запустить pdftotext в контейнере Docker, а затем выполнить его модульное тестирование в файле PDF.Я не уверен, что неправильно понимаю аргументы, необходимые для subprocess.run.Разве он не находит каталог файла pdf или вызов подпроцесса просто не работает, или это может быть проблема с докером?

Я запускаю docker-compose up myproject python3 -m unittest

Моя структура файла:

├── myproject
├── ├── extract.py
│   ├── tests
│   │   ├── testExtract.py
│   │   ├── testfiles
|   |   |   ├── sample.pdf

pdftotext метод:

def extract(filepath)
    text = subprocess.run(['pdftotext', filepath],
                                stdout=PIPE,
                                stderr=STDOUT)
    text = str(fullText.stdout)
    return text

метод теста внутри testExtract.py:

testGetText(self):
    expected = "b'Grab all text from this sentence.'"
    result = extract('./testfiles/sample.pdf')
    self.assertEqual(result, expected)

sample.pdf содержит только вышеприведенное предложение.

Когда я устанавливаю stderr на STDOUT, я получаю ошибку ввода-вывода, показанную ниже.Если я установлю stderr=subprocess.PIPE, я получу пустую двоичную строку.""

traceback:

FAIL: testGetText 
----------------------------------------------------------------------
Traceback (most recent call last):

AssertionError: 'b"I/O Error: Couldn\'t open file \'./tes[51 chars]ry."' != "b'Grab all text from this sentence.'"
- b"I/O Error: Couldn't open file './testFiles/1SentenceFile.pdf': No such file or directory."
+ b'Grab all text from this sentence.'

Редактировать: docker-compose.yml

version: "3"

services:
    myproject:
        build:
            context: .
            dockerfile: ./myproject/Dockerfile
        depends_on:
            - database
        volumes:
            #- ./otherproject/logs:/code/logs
              # Dev specific
            - ./myproject:/code
        stdin_open: true
        tty: true
    database:
        # Possibly could do configurations here and skip database DOCKERFILE
        build:
            context: .
            dockerfile: ./database/Dockerfile
        environment:
            POSTGRES_USER_FILE: /secrets/dbUser.txt
            POSTGRES_PASSWORD_FILE: /secrets/dbPassword.txt
        ports:
            - "8765:5432"
        volumes:
            - otherdata:/var/lib/postgresql/data


myproject / dockerfile:

FROM python:3.7.3-stretch

RUN apt-get update && apt-get install -y \
    poppler-utils

ARG moduleDir=myproject

WORKDIR /code

COPY secrets/ /secrets

# COPY $moduleDir/myproject/ ./

# Is executed before bind mount is implemented so need to COPY.
COPY $moduleDir/requirements/common.txt requirements/common.txt
COPY $moduleDir/requirements/development.txt requirements/development.txt
COPY .pylintrc ./

RUN pip install -r requirements/development.txt

...