Docker Run не выполняется для проекта Python - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующая структура проекта для одного из моих проектов Python:

raspi-motion-detection
|-- project
    |-- core
        |-- motion_detector.py
    |-- conf
        |-- conf.json

У меня тогда есть следующий Dockerfile:

FROM     jfloff/alpine-python
RUN      mkdir -p /raspi_motion_detection/project
WORKDIR  /raspi_motion_detection/project
COPY     ./ $WORKDIR/
COPY     ./requirements.txt $WORKDIR/
ADD      . $WORKDIR
CMD      ["python", "/core/motion_detector.py --conf conf/conf.json"]

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

Joes-MacBook-Pro-78:project joe$ docker run joesan/dummy
python: can't open file '/raspi_motion_detection/project/core/motion_detector.py --conf /raspi_motion_detection/project/conf/conf.json': [Errno 2] No such file or directory
Joes-MacBook-Pro-78:project joe$

Есть идеи о том, что происходит? На самом деле я ДОБАВИЛ РАБОЧИЙ ДИРЕКТОР во время выполнения Docker, но он все равно не нашел нужный файл Python.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

В последней строке вашего Dockerfile:

CMD ["python", "/core/motion_detector.py --conf conf/conf.json"]

Когда контейнер запускается, он пытается запустить python и передать ему один аргумент, который он интерпретирует как имя файла сценария для запуска. Этот аргумент , который полностью интерпретируется как имя сценария , равен /core/... conf/conf.json. Поскольку у вас нет ни одного файла с таким именем, пробелами, параметрами и всем, Python завершается ошибкой.

Если вы используете синтаксис JSON-ish, вам нужно разбить каждый отдельный аргумент на собственное «слово»:

CMD ["python", "core/motion_detector.py", "--conf", "conf/conf.json"]

(Обратите внимание, что директива WORKDIR глобально изменяет рабочий каталог для всех последующих команд, каталог по умолчанию для директив COPY и ADD и любые ENTRYPOINT и / или CMD, которые в конечном итоге запускаются. Нет переменной $WORKDIR, на которую вы можете ссылаться, и я подозреваю, что расширение переменной фактически приводит к тому, что файлы попадают в корневой каталог контейнера, когда вы этого не ожидаете. Попробуйте просто COPY ./ ./ добавить содержимое к изображению.)

0 голосов
/ 11 ноября 2018

Ну, вы используете полностью определенные пути, как они являются относительными.

Предполагая, что ваш Dockerfile находится в папке raspi-motion-detection в структуре вашего проекта ...

CMD      ["python", "/core/motion_detector.py", "--conf", "conf/conf.json"]

Часть /core... (обратите внимание, что я разбил все части команды на отдельные элементы) фактически будет указывать на местоположение относительно корневой папки, поскольку она начинается с '/', и она должна выглядеть отсюда:

/raspi_motion_detection/project/project/core/motion_detector.py

То же самое относится к conf/conf.json, что на самом деле кто-то будет указывать на что-то относительно WORKDIR. Возможно, вы захотите быть более конкретным и здесь: -)

вы можете проверить свою конфигурацию, запустив что-то вроде:

docker run -it --rm your_image /bin/bash

, а затем посмотрите, как и что вы добавили в свою сборку.

Ваш Dockerfile в некоторых пунктах, похоже, тоже не прав

  • Нельзя ссылаться на WORKDIR с помощью $ WORKDIR
  • Вы копируете файл require.txt, но никогда не запускаете его, поэтому он, вероятно, никогда ничего не сделает
  • Вы видите, чтобы скопировать всю структуру, и dat будет включать Dockerfile, который не нужен

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...