Python 使用docker compose运行pserve时未找到分发

Python 使用docker compose运行pserve时未找到分发,python,docker,pyramid,docker-compose,Python,Docker,Pyramid,Docker Compose,我正在尝试使用docker compose运行我的简单金字塔应用程序,下面是我的docker文件: Dockerfile: FROM python:2.7-onbuild RUN pip install --no-cache-dir -r requirements_dev.txt docker compose.yml db: image: mysql:5.6 web: build: . command: pserve development.ini --reload volu

我正在尝试使用docker compose运行我的简单金字塔应用程序,下面是我的docker文件:

Dockerfile

FROM python:2.7-onbuild
RUN pip install --no-cache-dir -r requirements_dev.txt
docker compose.yml

db:
  image: mysql:5.6

web:
  build: .
  command: pserve development.ini --reload
  volumes:
    - .:/usr/src/app
  ports:
    - "6543:6543"
  links:
    - db:db
当我运行
docker compose up
时,我得到了
pkg_resources.DistributionNotFound:找不到'tenders'发行版,它是应用程序所必需的
,这很奇怪,因为我的应用程序应该是通过
pip install-e.
命令安装的

事情变得越来越奇怪:

docker-compose run web bash
root@2323b6b2f3ca:/tenders# pip freeze | grep tenders  # no results
root@2323b6b2f3ca:/tenders# pip install -e .
Obtaining file:///tenders
# Skippping most of the outup for more readability
Installing collected packages: tenders
  Running setup.py develop for tenders
Successfully installed tenders
root@2323b6b2f3ca:/tenders# pip freeze | grep tenders
-e git+git@bitbucket.org:xxx/tenders.git@342a8f9101a3e06fa04d71f4eef81b461476d3a5#egg=tenders-master
现在,当我启动
pserve development.ini——重新加载
时,它工作正常


我做错了什么,如何使用
pip install-e.
(或任何其他命令)自动安装我的软件包
tenders

更新

FROM python:2.7-onbuild
RUN pip install --no-cache-dir -r requirements_dev.txt
在服务的
volumes
部分,您可以告诉Docker使用容器中的
.egg info
文件夹,而不是主机装载的卷中的文件夹

例如,请参见该配置中的
/usr/src/app/yourapp.egg info

web:
  build: .
  command: pserve development.ini --reload
  volumes:
    - .:/usr/src/app:cached
    - /usr/src/app/yourapp.egg-info
  ports:
    - "6543:6543"
  links:
    - db:db
先前的答案:

我也有同样的问题。它发生在装载docker卷时

在Dockerfile中,使用
pip install-e.
安装应用程序,这将在当前目录(图像中)中创建.egg info目录。但是稍后,当您使用docker卷将容器源目录替换为您的时,主机文件系统中没有这个.egg info目录

我修复它的方法是,我在主机文件系统中创建了一个virtualenv,我运行了
python setup.py develope
,但我想您可以运行
pip install-e.
。它创建了.egg info目录,这样当您从容器运行
pserve
时它就存在了。此时virtualenv可能会被删除


我真的不确定这是否是最好的解决方案,但至少现在您知道了问题的原因。

谢谢您的回复。因此,您建议修改Dockerfile,创建并激活virtualenv,然后安装软件包?不,我在主机文件系统中创建了virtualenv,以便主机文件系统中存在.egg info文件夹。然后,当您启动docker容器并装载卷时,映像目录将被删除,但来自主机的新目录也将作为.egg info目录。它实际上并不完美,可能还有一个更优雅的解决方案。抱歉,我不明白这一点:
但是,稍后,当您使用docker卷替换容器源目录时,您的主机文件系统中没有这个.egg info目录。
。为什么我没有那个目录而我的应用程序目录存在(注意-我不再删除docker文件中的.egg目录-请参见我的编辑)?在docker compose配置文件(
docker compose.yml
)中,您可能有一个以
卷:
开头的部分。它所做的是将容器中的目录替换为主机文件系统中的目录。在图像中,由于Dockerfile中的
pip安装
,目录包含.egg info目录。但是,当卷装入容器时,映像的目录将被主机文件系统上的目录替换,该目录不包含.egg info文件。如果我像您一样在主机上创建了venv和“pip install-e”。如果我的主机是Windows 10,而我的docker机器是Ubuntu,这有关系吗?也就是说,操作系统对所创建的.egg有任何影响吗?