【问题标题】:how to fix graphviz.backend.ExecutableNotFound in docker?如何修复 docker 中的 graphviz.backend.ExecutableNotFound?
【发布时间】:2021-09-17 04:11:23
【问题描述】:

我有一个错误:

  File "/usr/local/lib/python3.6/site-packages/graphviz/backend.py", line 244, in pipe
    out, _ = run(cmd, input=data, capture_output=True, check=True, quiet=quiet)
  File "/usr/local/lib/python3.6/site-packages/graphviz/backend.py", line 167, in run
    raise ExecutableNotFound(cmd)
graphviz.backend.ExecutableNotFound: failed to execute ['dot', '-Tpng'], make sure the Graphviz executables are on your systems' PATH

当我这样做时在我的 Mac 中:

dot -V

我明白了:

dot - graphviz version 2.47.3 (20210619.1520)

当我这样做时:

which dot

我明白了:

/usr/local/bin/dot

似乎 docker 不认识这个包。我试着做:

$ export PATH="${PATH}:/usr/local/bin"

Where do I add Graphviz's Executable on a Mac 中所述 但这并不能解决问题。

当我在码头时:

pip install graphviz

上面写着:

Requirement already satisfied: graphviz in /usr/local/lib/python3.6/site-packages (0.15)

如何让 docker 识别可执行文件? 我不能在 docker 中执行 brew install graphviz 这个命令仅在 Mac 终端中被接受,但在 docker 中不被接受。

【问题讨论】:

  • 容器有自己独立的文件系统和运行环境;它不能使用安装在 Docker 外部主机上的二进制文件(尤其是在主机和容器运行不同操作系统的 Mac 上)。您需要在镜像的 Dockerfile 中安装该软件包,可能使用 Debian apt-get 工具。
  • @DavidMaze 我怎样才能为正在运行的 docker 做到这一点?
  • 构建一个新镜像,停止并删除现有容器,然后docker run从更新的镜像中创建一个新容器。
  • @DavidMaze 为什么我不能在 docker 运行时“即时”执行此操作?
  • 因为一旦容器退出,您在容器文件系统中更改的任何内容都会丢失;因为您希望能够检查源代码控制构建映像和容器所需的步骤。此外,删除和重新创建容器非常便宜,没有理由避免它。

标签: python docker graphviz


【解决方案1】:

我假设在某些时候你已经在你的 docker 容器中安装了 python。拥有这个,你应该在你的项目中有一个名为requirements.txt的文件,里面有这样的东西:

graphviz=~2.47.3

你的 Dockerfile 应该是这样的:

FROM python:3.8.6-slim

RUN apt-get update && apt-get -y install
RUN pip install --upgrade pip

WORKDIR /code
COPY /code
COPY requirements.txt .

RUN pip install -r requirements.txt

CMD ["python3", "<yourPythonScript>.py"]
EXPOSE 3000
COPY . .

为了更好的解释,当你的容器构建完成时,你应该将requirements.txt文件复制到docker容器的工作目录,然后运行pip install -r requirements.txt命令。这样,graphviz 包将被安装并从其容器中访问。

注意:如果你不向我们展示你的 Dockerfile,这很难理解。

【讨论】:

  • 抱歉不清楚。码头工人已经在运行。我想为特定的临时用途添加包。所以我使用了docker exec -it id bash 并做了pip install graphviz 并运行了一个特定的脚本。脚本在我的 Mac 上运行良好,但在 docker 上无法运行
  • 现在我明白了。您是否尝试列出此容器中安装的软件包?如果您的容器基于 Alpine,请使用:docker exec -i &lt;container_id&gt; apk info -vv | sort。如果它基于 Debian 和 Ubuntu,请使用:docker exec -i &lt;container_id&gt; dpkg -l
  • pip freeze 显示软件包已安装,但我猜二进制文件丢失了。 pip install graphviz 由于某种原因还不够,我还需要运行 brew install graphviz 来获取二进制文件,但我不知道如何在正在运行的 docker 上执行此操作。
  • 好吧,我认为解决方案是将软件包安装在映像的 Dockerfile 中,就像您建议的那样@DavidMaze
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2020-07-28
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 2018-07-18
相关资源
最近更新 更多