首页 > 解决方案 > Docker 中的 subprocess.check_output 失败

问题描述

以前曾提出过类似的问题,但这些问题的解决方案并不能解决我自己的问题。我有一个依赖于基础 repo 的 repo,借此连接到 neo4j 数据库。我对基础回购工作的测试。我拥有的仓库(转换文件)已经证明可以在本地工作。当我在 Docker 中运行 repo 时,我得到一个FileNotFoundError从基础 repo 中抛出的:

基础回购模块

def get_docker_host_ip(self):
    z = subprocess.check_output(['ip', '-4', 'route', 'list', 'match', '0/0'])
    z = z.decode()[len('default via '):]
    return z[: z.find(' ')]

追溯:

Traceback (most recent call last):
  File "/opt/app/src/myscript.py", line 252, in <module>
    myModule = My_Module(args)
  File "/opt/app/src/myscript.py", line 45, in __init__
    self.neo4jadapter = Neo4jAdapter()
  File "/opt/app/base/base/neo4j_adapter.py", line 19, in __init__
    neo4j_host = self.get_docker_host_ip()
  File "/opt/app/base/base/neo4j_adapter.py", line 51, in get_docker_host_ip
    z = subprocess.check_output(['ip', '-4', 'route', 'list', 'match', '0/0'])
  File "/usr/lib/python3.7/subprocess.py", line 395, in check_output
    **kwargs).stdout
  File "/usr/lib/python3.7/subprocess.py", line 472, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'ip': 'ip'

对于subprocess.check_output,我也shell=True按照其他帖子的推荐添加了,但并没有什么不同:

z = subprocess.check_output(['ip', '-4', 'route', 'list', 'match', '0/0'], shell=True)

此 Traceback 仅在我在 Docker 中运行脚本时发生。我哪里错了?

标签: python-3.xdockerneo4jsubprocess

解决方案


感谢@DavidMaze 的评论,该ip工具需要通过 Docker 安装,例如:

RUN apt-get install iproute2

推荐阅读