Я работаю над проектом Python, и мне нужно создать образ докера для тестирования. В моем проекте у меня есть файл main.py с оператором
from <module> import *. здесь представлена папка, в которую я поместил все остальные файлы моего проекта.
Докер-файл выглядит следующим образом:
FROM continuumio/miniconda3
COPY parcellation_env.yml .
RUN conda env create -f parcellation_env.yml
SHELL ["conda", "run", "-n", "parcellation_env", "/bin/bash", "-c"]
COPY main.py .
ADD module/ .
ENTRYPOINT ["conda", "run", "-n", "parcellation_env", "python", "main.py", "-C", "white_matter_parcellation/config/config_point_autoencoder.yaml", "--use_splits", "-y"]
При создании образа все работает нормально, но когда я пытаюсь запустить образ в контейнере, получаю ошибку «Нет модуля с именем «модуль», сигнализирующую, что что-то пошло не так.
Я новичок в докере и использую его впервые. Кто-нибудь знает, что пошло не так?
Примечание: ошибка возникает, если я добавляю ADD и COPY для модуля/, я уже пробовал это изменить.
Обновлено:
Структура папок моего проекта в настоящее время следующая
|--main.py
|--module
|--parcellation_env.yml
|--__init__.py
|----folder1
|------folder_1_files
|------folder_1_init
|----folder2
|------folder_2_files
|------folder_3...
|------folder_2_init
...






Есть несколько проблем, которые я мог бы увидеть в идеале: если у вас возникают ошибки модуля, это обычно указывает на то, что Python не может найти конкретный модуль, о котором идет речь.
Я думаю, что лучше всего реструктурировать способ размещения файлов через файл Docker для использования Python.
Я внес несколько изменений и надеюсь, что это поможет, если я подозреваю, что у меня нет WORKDIR.
Убедитесь, что ваша структура такая
├── Dockerfile
├── main.py
├── module or src/
│ ├── __init__.py
│ ├── files.py
├── parcellation_env.yml
вот фрагмент вашего файла Docker с несколькими модами.
FROM continuumio/miniconda3
# Copy the environment file and create the conda environment
COPY parcellation_env.yml .
RUN conda env create -f parcellation_env.yml
# Set the shell to use the conda environment
SHELL ["conda", "run", "-n", "parcellation_env", "/bin/bash", "-c"]
# Your working directory should include src/*/*/ etc. tests and the likes
WORKDIR /app
# copy the main script and the module directory to /app
COPY main.py /app/
ADD module/ /app/module/
ENV PYTHONPATH=/app
ENTRYPOINT ["conda", "run", "-n", "parcellation_env", "python", "main.py", "-C", "white_matter_parcellation/config/config_point_autoencoder.yaml", "--use_splits", "-y"]
@Neskelogth, чтобы ответить на ваш вопрос, ADD - это больше, чем просто специалист по копированию папок, хотя COPY копирует только файлы, я думаю, если у вас есть что-нибудь в этой папке, он это скопирует. Но ADD делает больше, чем просто копирование папок, слово «рекурсивный» может не отражать то, что ADD делает теоретически, за исключением того, что вы хотите ограничить его (добавить) областью папок, тогда вы можете сказать, что ха-ха!. если у вас есть время, вот URL-адрес для добавления/копирования документов, это даст вам больше информации, чем я, о том, что они могут и чего не могут docs.docker.com/build/building/best-practices/#add- или - скопируйте
PS: Пожалуйста, дайте мне знать, если это помогло...
Итак, я попытался посмотреть, что вы там связали, но, к сожалению, это не помогло. В моем случае у меня есть структура папок как
@Neskelogth, ты имеешь в виду, что это не поможет тебе понять ДОБАВИТЬ/КОПИРОВАТЬ?
Итак, я попытался посмотреть, что вы там связали, но, к сожалению, это не помогло. В моем случае структура папок такая же, как при редактировании исходного вопроса. И по какой-то причине докер не может получить доступ к этим внутренним папкам. Одна из папок содержит файлы конфигурации, которые используются в моем проекте Python для настройки пользователем некоторых частей скрипта. Когда я пытаюсь запустить код с помощью Docker, утверждение не выполняется, потому что
Python дает путь: модуль/config/config_file не существует. Отвечая на ваш вопрос, я их понял, но, к сожалению, чего-то все еще не хватает.
Насколько я хотел вам помочь, ваш первоначальный вопрос был: «Нет модуля с именем Ошибка при запуске образа докера», который, как вы сказали, работает: «Спасибо за ответ, я попробовал, и, похоже, теперь модуль захвачен». Я не знаю, допускает ли стек два вопроса, однако. Если вы перемещаете файлы в свое изображение, это может быть просто -> ADD root_source/ /app или ADD root_source/ ./ или вы даже можете написать скрипт Python, чтобы заархивировать все ваши файлы и разархивировать их с помощью ADD. . Вы задаете два вопроса в одном, я бы предложил закрыть этот вопрос и задать другой вопрос.
когда вы откроете новый вопрос, укажите мне на него, я напишу для вас сценарий для архивирования, мы можем позаботиться об этом, пожалуйста, убедитесь, что вы предоставили минимально воспроизводимый код. однако если вы разобрались с этим, то все в порядке..
Я только что разместил новый вопрос здесь, когда задаю вопрос. спасибо за помощь
круто посмотри на твои комментарии
Спасибо за ответ, попробовал и вроде теперь модуль захватывает. Проблема, скорее всего, в том, что в структуре внутри модуля есть еще какие-то подмодули (например, в папке модуля есть подпапка data со своими файлами и своим init). Являются ли команды ADD или COPY рекурсивными? Или есть способ указать, что они должны быть рекурсивными?