Не удалось импортировать пользовательский файл модуля Python при использовании docker

#python #docker

#python #docker

Вопрос:

У меня есть два файла python a.py и b.py , структура каталога выглядит следующим образом:

  • файлы (каталог)

    • main(dir)
      • a.py
      • Dockerfile
    • b.py

В a.py есть некоторый код, подобный этому:

 import sys
sys.path.append('..')
import b
  

Я могу хорошо запустить его через командную строку. Но не удалось запустить его с помощью docker. Вот код для создания и запуска образа docker:

файл Dockerfile:

 FROM python:3.6
ADD a.py /.
WORKDIR /.
ENV PYTHONPATH /files/
CMD [ "python3", "a.py" ]
  

Команды для создания образа:

 # cd /files/main
# docker build -t a:1.0 .
  

Изображение было успешно создано, и команды для запуска изображения:

 # docker run --name a a:1.0
  

Это дает мне:

 Traceback (most recent call last):   
 File "a.py", line 3, in <module>
   import b
ModuleNotFoundError: No module named 'b'
  

Мой вопрос, учитывая этот пример, как я могу создать и запустить изображение правильным образом?

Комментарии:

1. b.py не находится внутри контейнера, поскольку вы копируете содержимое только одного скрипта, а не всего каталога. Вам необходимо скопировать по крайней мере все модули, которые вы хотите использовать, чтобы импортировать их

Ответ №1:

Измените свой файл Dockerfile, чтобы скопировать оба a.py amp; b.py

 FROM python:3.6
ENV PYTHONPATH /files/
WORKDIR /app
COPY main/a.py b.py ./
CMD [ "python3", "a.py" ]
  

Запуск docker build из-за пределов основного каталога —

$ docker build -f main/Dockerfile -t a:1.0 .
$ docker run --name a a:1.0

Попробуйте!

Комментарии:

1. b.py должно быть в files папке, потому что у меня есть какой-то другой скрипт, использующий b.py , я бы хотел сохранить свою файловую структуру.

2. Вы имеете в виду, b.py находится внутри файлов, а main также внутри файлов? Не могли бы вы отредактировать свой вопрос, чтобы помочь нам со структурой каталогов. Текущее представление выглядит немного неясным.

3. Обновлен ответ. Посмотрите, поможет ли это!

4. Может быть, изменить WORKDIR /app на WORKDIR /files ?

5. ДА. Вы можете удалить инструкцию ENV, чтобы уменьшить #layers для изображения.

Ответ №2:

Вам нужно поместить b.py внутрь контекста Docker и скопировать его в контейнер. Вы можете посмотреть официальную документацию, если хотите узнать больше о контексте сборки.