首页 > 编程问答 >使用 docker run 将 Python 单击选项传递给 ENTRYPOINT 会出现错误:“在 $PATH 中找不到可执行文件”

使用 docker run 将 Python 单击选项传递给 ENTRYPOINT 会出现错误:“在 $PATH 中找不到可执行文件”

时间:2024-07-27 14:32:53浏览次数:12  
标签:python docker python-click docker-run

我有一个简单的 python 脚本,我想在 docker 容器内运行它。它打印一行消息“Hello {name}”。 python 脚本使用 click CLI 界面来定义收件人名称,如果我直接运行它(不使用 docker run 命令),它将如下所示:

python hello.py -n Smith

Docker build 命令:

docker build . -t hello:1.0.0

Docker run 命令:|| |使用此 docker run 命令时,我收到一条错误消息

docker run --rm -v $(pwd):/app hello -n Smith

完整的错误消息如下: exec: "-n": executable file not found in $PATH: Dockerfile:

docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-n": executable file not found in $PATH: unknown.

我的简单

FROM python:3.11.0-slim
RUN mkdir -p /app
WORKDIR /app
COPY . .
RUN python -m pip install --upgrade pip
RUN python -m pip install click
RUN chmod +x ./* 
ENTRYPOINT [ "python", "hello.py" ]

使用单击的脚本: hello.py 预期输出:

#!/usr/bin/env python3

import click

@click.command()
@click.option('-n', '--name', help='Name of message recipient')
def hello(name):

    # Print to screen and to file
    msg = f'Hello {name}'
    print(msg)
    with open("hello.txt", "w") as f:
        f.write(msg)

if __name__ == '__main__':
    hello() 

我尝试将单击选项名称更改为其他名称,例如

Hello Smith

-r ,但我得到了相同的错误。 --recipient 当我从 docker run 命令中删除

时,我得到以下预期输出: -n Smith from the docker run command I get the following expected output:

Hello None

遇到的问题在于,正试图将 click 选项直接传递给 docker run 命令。 docker run 命令将传递给它的任何内容都解释为要运行的容器的 参数 。在这种情况下,它将 -n Smith 解释为传递给 ENTRYPOINT 中定义的 python hello.py 命令的参数。由于 python 命令本身并不识别 -n 选项,因此它会引发错误。

可以通过以下两种方式解决此问题:

1. 将命令作为 docker run 的一部分传递:

docker run --rm -v $(pwd):/app hello:1.0.0 python hello.py -n Smith

此命令直接将 python hello.py -n Smith 作为要执行的命令传递给容器。 ENTRYPOINT 将被忽略,因为在命令行中显式指定了要运行的命令。

2. 使用 CMD 指令并覆盖默认值:

修改的 Dockerfile,将 ENTRYPOINT 更改为 CMD

FROM python:3.11.0-slim
RUN mkdir -p /app
WORKDIR /app
COPY . .
RUN python -m pip install --upgrade pip
RUN python -m pip install click
RUN chmod +x ./* 
CMD [ "python", "hello.py" ]

然后,可以使用以下命令运行容器并传递 click 选项:

docker run --rm -v $(pwd):/app hello:1.0.0 -n Smith

在这种情况下, CMD 指令定义了默认命令,但可以通过在 docker run 命令中提供参数来覆盖它。

总结

第一种方法更为直接,特别是在希望完全控制传递给脚本的参数时。第二种方法在希望为容器定义默认命令,但允许用户在需要时覆盖该命令时非常有用。 选择哪种方法取决于的具体需求。

标签:python,docker,python-click,docker-run
From: 77632954

相关文章

  • 标题:在 OpenSees Python 中定义具有特定卸载行为的双线性弹塑性材料
    我正在使用Python中的OpenSees,我想定义一种在负载下表现出双线性弹塑性行为的材料。但是,我需要在卸载过程中将材质返回到其原始位置,遵循准确的加载路径。在此处输入图像描述我不确定如何在OpenSees中正确实现卸载行为,我正在寻找实现这一具体材料反应的指导。......
  • 使用正则表达式删除Python中常见的公司名称后缀
    我正在努力删除一些公司名称中的后缀。预期结果如下:原始名称:AppleInc.SonyCorporationFiatChryslerAutomobilesS.p.A.SamsungElectronicsCo.,Ltd.清除名称:AppleSonyFiatChryslerAutomobilesSamsungElectronics到目前为止我所做的:importred......
  • 如何将 Brave 网络浏览器与 python、selenium 和 chromedriver 结合使用?
    我从Google的Chrome切换到Brave网络浏览器并且很难让它像Chrome一样与Brave一起使用。Brave是基于Chromium的,所以我猜它应该不会那么难。我确保我的Brave和Chromedriver处于相同版本,像这样,~/some/path$chromedriver--versionChromeDriver76.0.3......
  • 覆盖 python 应用程序时权限被拒绝
    我使用python制作了一个粗略的自动更新应用程序,并使用freeze-cx制作了exe文件。首先,该应用程序检查firebase服务器上是否有最新版本的文件可用,如果可用则下载zip文件。并且应用程序解压并覆盖文件。this_file_path=sys.executableifgetattr(sys,'frozen......
  • Python数据分析案例55——基于LSTM结构自编码器的多变量时间序列异常值监测
    案例背景时间序列的异常值检测是方兴未艾的话题。比如很多单变量的,一条风速,一条用电量这种做时间序列异常值检测,想查看一下哪个时间点的用电量异常。多变量时间序列由不同变量随时间变化的序列组成,这些时间序列在实际应用中通常来自不同的传感器或数据源。多变量时间序列异......
  • 我没有 python 但我有 python3
    我最近格式化了我的笔记本电脑并安装了Ubuntu操作系统。我没有明确安装Python。为了检查它是否已预安装,我在终端中运行python--version并得到了这个:$python--versionCommand'python'notfound,butcanbeinstalledwith:sudoaptinstallpython3......
  • 基于YOLOv9的停车场空闲车位检测【python源码+UI界面+数据集+模型+语音报警+安装说明
    往期精品导航基于YOLOv9的脑肿瘤区域检测智慧课堂基于YOLOv8的学生上课行为检测基于YOLOv9+pyside的安检仪x光危险物物品检测(有ui)基于YOLOv9的PCB板缺陷检测基于YOLOv9的线路绝缘子缺陷检测【python源码+UI界面+数据集+模型+语音报警+安装说明】基于YOLOv9的道路状况检测【......
  • 1-python的数据类型与变量
    一、交互模式与脚本模式交互模式:就相当于一种问答模式,关闭即消失无法保存重用比如python自带的编译器脚本模式:可以将代码长期保存以及重复使用如何创建脚本模式:idle——file——newfile[快捷方式:idle——ctrl+n]保存:ctrl+s运行:F5二、变量(Variable)变量:会变化......
  • 2-Python数据类型——序列
    Python数据类型——序列一、序列序列是一个可以存放多个值的容器。有序序列:在序列中每个值都有对应的下标下标:就相当于酒店的房间号,方便客人的查找与酒店的管理在编程中下标的起始值与日常生活中的计数有所不同:下标的计数从0开始计数,从左往右计数:下标从0开始往右递......
  • crontab 运行 .sh 文件调用 python 脚本
    我有一个pythonselenium脚本,可以打开chrome并为我运行一些自动化任务。在crontab中直接调用python可以使用下面的行。:10.0是我运行echo$DISPLAY时得到的值。我使用的是Ubuntu22.04.4LTS5823**2DISPLAY=:10.0/usr/bin/python3/home/user/Script......