使用 docker 将本地包添加到诗歌中

Adding local package to poetry with docker

我目前正在将一些脚本推送到 docker 图像并使用 poetry 安装依赖项。我想使用的依赖项之一涉及将其中一个目录构建到我可以导入的模块中。这是一个例子:

poetry-project
 │   ├ poetry_project
 │   │      └── ex1.py
 │   └ dockerfile
 │   └ pyproject.toml
 │   └ poetry.lock
 │   
 tools
     ├ python_tools
            └── project_tools.py

我想在 ex1.py class 中执行以下操作:

#ex1.py class
from python_tools import project_tools

project_tools.do_stuff()

我的 docker 文件的示例:

FROM python:3.6
COPY pyproject.toml pyproject.toml
RUN poetry update
COPY poetry_project/ poetry_project/

最终我想要 运行 像 docker run python3 poetry_project/ex1.py 这样的命令并且能够利用 project_tools 导入。我读过我可以通过这样做将包添加到 pyproject.toml:

my_package = { path = "/project_name/tools/python_tools/" }

但是这似乎对我不起作用,因为我收到以下错误:

Directory does not seem to be a Python package

如有任何帮助,我们将不胜感激。

a) 最好指定代码在容器内的绝对位置:

COPY . /usr/src/mypythonapp
WORKDIR /usr/src/mypythonapp

因此,您的代码将存在于 /usr/src/mypythonapp 中。这个目录将是所有命令 运行 所在的基本目录。不需要丑陋的链接 cd xxx && do xxx && bla bla.

b) 在 ex1.py 中您可以指定额外的“包含路径”:

sys.path.append(os.path.abspath("/usr/src/mypythonapp/tools/"))

c) 您可以在 Dockerfile 中使用 CMD 自动 运行 文件:

CMD ["python3", "/full/path/to/your/script.py"]