好吧,我有一个相当基本的 python clickCLI 应用程序,当在容器中使用绑定卷(文件上的实时开发)运行时,它似乎打破了entry_point我在setup.py
运行以下任一命令
$ docker run -it -v $(pwd):/opt/app gdax
$ docker run -it --mount src=$(pwd),target=/opt/app,type=bind gdax
Run Code Online (Sandbox Code Playgroud)
我得到以下内容
Traceback (most recent call last):
File "/usr/local/bin/gdax", line 6, in <module>
from pkg_resources import load_entry_point
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3144, in <module>
@_call_aside
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3128, in _call_aside
f(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3157, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 666, in _build_master
ws.require(__requires__)
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 984, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 870, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'gdax-cli' distribution was not found and is required by the application
Run Code Online (Sandbox Code Playgroud)
FROM python:3.6
RUN mkdir /opt/app
COPY . /opt/app
WORKDIR /opt/app
RUN pip install --editable .
CMD ["gdax", "--help"]
Run Code Online (Sandbox Code Playgroud)
from setuptools import setup
setup(
name='gdax-cli',
version='0.1',
py_modules=['app'],
install_requires=[
'click==6.7',
'gdax==1.0.6'
],
entry_points='''
[console_scripts]
gdax=app:cli
''',
)
Run Code Online (Sandbox Code Playgroud)
#!/usr/local/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'gdax-cli','console_scripts','gdax'
__requires__ = 'gdax-cli'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('gdax-cli', 'console_scripts', 'gdax')()
)
Run Code Online (Sandbox Code Playgroud)
如果我不绑定卷,我可以很好地执行脚本,但我失去了在主机上编辑文件的能力。我相当有信心这与绑定“覆盖”文件的方式有关,并且会破坏/usr/local/bin/gdax加载setuptools. 有没有办法规避这个问题(除了调用python app.py容器之外)?
对于任何有兴趣在开发过程中调用 Pythonentry_points控制台脚本的人docker-compose run。将文件夹从正在运行的容器复制.egg-info到已安装的主机目录一次对我来说很有效。
将.egg-info目录从正在运行的容器复制到主机。预先关闭安装,以免.egg-info目录被覆盖。
sudo docker cp <container id>:/path/to/package/in/container/package.egg-info /path/to/mounted/package/on/host/package.egg-info
Run Code Online (Sandbox Code Playgroud)
重新启用安装,所需的.egg-info文件夹现已存在,因此安装的入口点应该可以工作,您可以运行如下命令:
sudo docker-compose run <service name> <entry_point console script name> [OPT] [ARG]
Run Code Online (Sandbox Code Playgroud)
为此,需要在映像中以开发模式安装 Python 包,例如 with RUN pip install -e /path/to/package/,因为.egg-info我猜,否则该文件将不会位于符号链接的源代码目录中。
当然,另一种选择,就像@Adam提到的那样,总是CLI直接调用脚本,如下所示:
sudo docker-compose run <service name> python /path/to/package/cli.py [OPT] [ARG]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1133 次 |
| 最近记录: |