使用 docker-compose 运行 pserve 时 DistributionNotFound

mat*_*ino 5 python pyramid docker docker-compose

我正在尝试使用 docker-compose 运行我的简单 Pyramid 应用程序,以下是我的 docker 文件:

Dockerfile

FROM python:2.7-onbuild
RUN pip install --no-cache-dir -r requirements_dev.txt
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

当我运行时,docker-compose up我得到了pkg_resources.DistributionNotFound: The 'tenders' distribution was not found and is required by the application,这很奇怪,因为我的应用程序应该是通过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
Run Code Online (Sandbox Code Playgroud)

现在,当我启动pserve development.ini --reload它时,它工作得很好。

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

Ant*_*air 6

更新

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
Run Code Online (Sandbox Code Playgroud)

上一个答案:

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

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

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

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