Docker卷绑定中断python脚本CLI条目

2024-04-26 17:59:32 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我有一个相当基本的python clickCLI应用程序,当它与容器中的绑定卷一起运行时(live dev on files),它似乎会破坏我在setup.py中的entry_point

运行以下任一命令

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

我得到以下信息

^{pr2}$

Dockerfile文件

FROM python:3.6

RUN mkdir /opt/app
COPY . /opt/app


WORKDIR /opt/app

RUN pip install --editable .

CMD ["gdax", "--help"]

在设置.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<;-在容器上

#!/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之外)?


Tags: 文件pyimportappcliusrsyssetup
2条回答

当在当前目录中以可编辑的方式安装pip时,<package>.egg-info目录需要存在,python才能找到已安装的包。在

可以通过docker-compose.yml装载点来“白名单”目录,如下所示:

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

在本例中,当容器启动时,.git和{}目录都将出现。在

对于任何有兴趣在开发期间通过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文件夹现在已经存在,因此安装的入口点应该可以工作,您可以运行命令,如:

^{pr2}$

为了实现这一点,Python包需要在映像中以开发模式安装,就像使用RUN pip install -e /path/to/package/,否则{}文件将不在符号链接的源代码目录中。在

当然,另一种选择,就像@Adam提到的,总是直接调用CLI脚本,比如:

sudo docker-compose run <service name> python /path/to/package/cli.py [OPT] [ARG]

相关问题 更多 >