Трубопровод Луиджи в Докерфиле; неизвестная инструкция PYTHONPATH - PullRequest
0 голосов
/ 04 января 2019

У меня есть этот Dockerfile:

FROM python:3.7
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD [
'PYTHONPATH="."', 'luigi', '--module', 'pipe',
'CreateAndFillIndex',
'--index', 'test',
'--http-auth', 'username:password',
'--host', 'localhost',
'--port', '9200'
 ]

Выполнение docker build -t suggestpipe . && docker run -it suggestpipe с этим Dockerfile Я получаю ошибку:

unknown instruction: "PYTHONPATH='.'",

и если я удалю эту инструкцию, я получу unknown instruction: "LUIGI",, так что я делаю не так?

В needs.txt есть зависимость от luigi. И 'PYTHONPATH ='. ' было необходимо для локального запуска за пределами Docker на моем Mac, поэтому я перенес эту инструкцию CMD в Dockerfile, но я не уверен, нужна ли она мне. Как мне запустить мой трубопровод?

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Синтаксис Dockerfile на самом деле не является JSON, и после [ не может быть разрыва строки. Docker фактически переписывает это на

CMD ["/bin/sh", "-c", "["]

(что на самом деле будет действительным! Возможно, у вас есть /bin/[ двоичный файл! Но контейнер немедленно завершит работу с кодом состояния 0.)

и затем переходит к следующей строке

"PYTHONPATH='.'", "luigi", "--module", "pipe",

, где это путается, потому что на самом деле это не похоже на директиву Dockerfile.

Простое удаление этой новой строки само по себе приведет вас к этому лишь частично. Если вы запускаете

CMD ["PYTHONPATH='.'", "luigi", ...]

Docker не будет запускать оболочку, чтобы попытаться запустить это; вместо этого он будет искать двоичный файл с именем точно PYTHONPATH='.' в обычных каталогах, а когда он не найдет , например, /usr/bin/PYTHONPATH='.', он будет жаловаться.

Вам вообще не нужно устанавливать эту переменную среды (тем более что шаг pip install установит пакеты в изолированную глобальную установку Python образа), и я бы просто удалил ее:

CMD ["luigi", ...]

Если вам нужно установить его, вам нужно использовать явную директиву ENV

ENV PYTHONPATH .
0 голосов
/ 04 января 2019

Это связано с тем, что вы предоставляете инструкцию CMD. В настоящее время вы используете форму exec, но вы полагаетесь на поведение оболочки. Подробности об этом можно найти в документации Dockerfile по инструкции CMD .

Исправление - преобразовать его в формат оболочки следующим образом:

CMD PYTHONPATH='.' luigi --module pipe CreateAndFillIndex --index test --http-auth username:password --host localhost --port 9200

В качестве альтернативы вы можете установить переменную среды, используя инструкцию ENV ( документация )

ENV PYTHONPATH=.
CMD [ "luigi", "--module", "pipe", 'CreateAndFillIndex', '--index', 'test', '--http-auth', 'username:password', '--host', 'localhost', '--port', '9200' ]
0 голосов
/ 04 января 2019

Ошибка довольно очевидна: неизвестная инструкция: "PYTHONPATH = '.'",

Вы добавили ненужные галочки (') до и после PYTHONPATH =, что считается записью вывода команды в терминах оболочки. Удалите ненужные галочки, и это должно работать.

...