subprocess.check_output 在 Docker 中失败

问题描述

之前有人问过类似的问题,但这些问题的解决方案并不能解决我自己的问题。我有一个依赖于基本存储库的存储库,通过它连接到 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','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','0/0'],shell=True)

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

解决方法

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

ip