docker卷绑定断裂python脚本cli entry_point



好的,所以我有一个相当基本的python python click cli应用程序,当在容器中使用绑定卷运行时(live dev on Files on Files)似乎打破了我在setup.py

运行以下任何一个命令

$ docker run -it -v $(pwd):/opt/app gdax
$ docker run -it --mount src=$(pwd),target=/opt/app,type=bind gdax

我得到以下

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

dockerfile

FROM python:3.6
RUN mkdir /opt/app
COPY . /opt/app

WORKDIR /opt/app
RUN pip install --editable .
CMD ["gdax", "--help"]

setup.py

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
    ''',
)

/usr/local/bin/gdax&lt ;-在容器上

#!/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')()
    )

如果我不绑定卷,我可以很好地执行脚本,但是我失去了编辑主机计算机上文件的能力。我非常有信心这与绑定"覆盖"文件的绑定有关,并且会破坏/usr/local/bin/gdax加载setuptools放置的文件的能力。无论如何,是否可以绕过这个(在容器中调用python app.py之外)?

在当前目录中安装pip作为可编辑时,python需要出现 <package>.egg-info目录才能找到已安装的软件包。

一个人可以从被docker-compose.yml安装点覆盖的"白名单"目录,例如:

services:
  myapp:
    image: mafrosis/myapp:dev
    build:
      context: .
    volumes:
      - ./:/app
      - /app/.git
      - /app/myapp.egg-info

在此示例中,当容器启动时,.gitmyapp.egg-info目录都将存在。

对于任何有兴趣在开发过程中通过docker-compose run调用Python entry_points控制台脚本的人。将.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

重新启用安装,现在存在所需的.egg-info文件夹,因此已安装的Entry_points应该工作,您可以运行命令:

sudo docker-compose run <service name> <entry_point console script name> [OPT] [ARG]

为此,需要将python软件包安装在图像中的开发模式中,例如使用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]

最新更新