Python 使用docker compose运行pserve时未找到分发
我正在尝试使用docker compose运行我的简单金字塔应用程序,下面是我的docker文件: Dockerfile: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
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有任何影响吗?