Python 在Docker中安装pip时找不到模块

Python 在Docker中安装pip时找不到模块,python,docker,Python,Docker,我的setup.py中有以下内容 entry_points={ 'console_scripts': [ 'my-app=main:run', ], def run(): actual_run() 我的文件结构是 ▶ tree -L 2 . ├── Dockerfile ├── README.md ├── redis.conf ├── setup.cfg ├── setup.py ├── src │ ├── main

我的
setup.py中有以下内容

    entry_points={
        'console_scripts': [
            'my-app=main:run',
        ],
def run():
    actual_run()
我的文件结构是

▶ tree -L 2
.
├── Dockerfile
├── README.md
├── redis.conf
├── setup.cfg
├── setup.py
├── src
│   ├── main.py
│   ├── settings.py
│   ├── bfile.py
│   └── afile.py
在my
main.py中

    entry_points={
        'console_scripts': [
            'my-app=main:run',
        ],
def run():
    actual_run()
本地,在执行时以虚拟的方式

pip install -e . && my-app
它运行平稳

但是,在使用以下
Dockerfile

FROM python:3.9-slim-buster

WORKDIR /app

COPY . .
RUN pip3 install .

CMD [ "my-app"]
我明白了

回溯(最近一次呼叫最后一次):
文件“/usr/local/bin/my app”,第5行,在
从主导入运行
ModuleNotFoundError:没有名为“main”的模块
我注意到,在我的图像中,在
/usr/local/lib/python3.9/site packages/
中,只有一个名为
my-app-0.0.1.dist info
的文件,而不是包含源文件的目录


为什么会这样?

您没有给出最低可行的
设置.py
,但下一步可能会起作用,仅供参考:

Dockerfile:

FROM python:3.9-slim-buster

WORKDIR /app

COPY . .
RUN pip3 install .

CMD [ "my-app"]
from setuptools import setup, find_packages

setup(
    name="my-app",
    version="0.0.1",

    packages=['main'],
    package_dir={'main':'src'},
    entry_points={
        'console_scripts': [
            'my-app=main.main:run',
        ],
    }
)
def run():
    print("hello world")
# docker build -t abc:1 .
# docker run --rm abc:1
hello world
setup.py:

FROM python:3.9-slim-buster

WORKDIR /app

COPY . .
RUN pip3 install .

CMD [ "my-app"]
from setuptools import setup, find_packages

setup(
    name="my-app",
    version="0.0.1",

    packages=['main'],
    package_dir={'main':'src'},
    entry_points={
        'console_scripts': [
            'my-app=main.main:run',
        ],
    }
)
def run():
    print("hello world")
# docker build -t abc:1 .
# docker run --rm abc:1
hello world
src/main.py:

FROM python:3.9-slim-buster

WORKDIR /app

COPY . .
RUN pip3 install .

CMD [ "my-app"]
from setuptools import setup, find_packages

setup(
    name="my-app",
    version="0.0.1",

    packages=['main'],
    package_dir={'main':'src'},
    entry_points={
        'console_scripts': [
            'my-app=main.main:run',
        ],
    }
)
def run():
    print("hello world")
# docker build -t abc:1 .
# docker run --rm abc:1
hello world
执行:

FROM python:3.9-slim-buster

WORKDIR /app

COPY . .
RUN pip3 install .

CMD [ "my-app"]
from setuptools import setup, find_packages

setup(
    name="my-app",
    version="0.0.1",

    packages=['main'],
    package_dir={'main':'src'},
    entry_points={
        'console_scripts': [
            'my-app=main.main:run',
        ],
    }
)
def run():
    print("hello world")
# docker build -t abc:1 .
# docker run --rm abc:1
hello world
解释:

FROM python:3.9-slim-buster

WORKDIR /app

COPY . .
RUN pip3 install .

CMD [ "my-app"]
from setuptools import setup, find_packages

setup(
    name="my-app",
    version="0.0.1",

    packages=['main'],
    package_dir={'main':'src'},
    entry_points={
        'console_scripts': [
            'my-app=main.main:run',
        ],
    }
)
def run():
    print("hello world")
# docker build -t abc:1 .
# docker run --rm abc:1
hello world
在上面,
src
文件夹将映射到
main
模块,并且
packages=['main']
指定将安装到
站点包中的python包名

在最终图像中,包的位置如下所示:

root@7b5ce63d8226:/usr/local/lib/python3.9/site-packages/main# ls
__pycache__  main.py
因此,您需要使用
main.main:run
调用您的函数