Это работает локально, но не в контейнере 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