【问题标题】:Discrepancy between two hosts running the same docker commands运行相同 docker 命令的两台主机之间的差异
【发布时间】:2020-12-19 03:36:09
【问题描述】:

一位同事和我有一个 Docker 难题。

当我们运行以下命令时,我们会得到不同的结果。

docker run -it python:3.8.6 /bin/bash
pip install fbprophet

对我来说,它安装得很好,而对他来说,它会产生错误并且无法安装。我认为docker的全部目的是防止这种问题,所以我真的很困惑。

我将在下面提供更多详细信息,但我的主要问题是:

  • 我们怎么可能得到不同的结果?

更多细节:

我们俩都在 Catalina 上使用类似规格的新 MacBook Pro 运行 Docker。他的 Docker 引擎版本 20.x.x 比我的 19.X.X 稍新。另外:

  • 他尝试了所有他能想到的命令来清理 Docker 中的内容。
  • 我们验证了图像 ID 的哈希值相同。
  • 我们的资源设置也是一样的。
  • 他尝试重新安装 Docker 并更改为其他版本的 python (3.7)。
  • 在过去三天里,我们多次同时尝试。

结果总是一样的:他得到了错误,而我没有。

他得到的错误如下。

Error:
Installing collected packages: six, pytz, python-dateutil, pymeeus, numpy, pyparsing, pillow, pandas, korean-lunar-calendar, kiwisolver, ephem, Cython, cycler, convertdate, tqdm, setuptools-git, pystan, matplotlib, LunarCalendar, holidays, cmdstanpy, fbprophet
    Running setup.py install for fbprophet ... error
    ERROR: Command errored out with exit status 1:
     command: /usr/local/bin/python -u -c ‘import sys, setuptools, tokenize; sys.argv[0] = ‘“’”‘/tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/setup.py’“‘”’; __file__=‘“’”‘/tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/setup.py’“‘”’;f=getattr(tokenize, ‘“’”‘open’“‘”’, open)(__file__);code=f.read().replace(‘“’”‘\r\n’“‘”’, ‘“’”‘\n’“‘”’);f.close();exec(compile(code, __file__, ‘“’”‘exec’“‘”’))' install --record /tmp/pip-record-7n8tvfkb/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.8/fbprophet
         cwd: /tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/
    Complete output (10 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib
    creating build/lib/fbprophet
    creating build/lib/fbprophet/stan_model
    Importing plotly failed. Interactive plots will not work.
    INFO:pystan:COMPILING THE C++ CODE FOR MODEL anon_model_dfdaf2b8ece8a02eb11f050ec701c0ec NOW.
    error: command ‘gcc’ failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: /usr/local/bin/python -u -c ‘import sys, setuptools, tokenize; sys.argv[0] = ‘“’”‘/tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/setup.py’“‘”’; __file__=‘“’”‘/tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/setup.py’“‘”’;f=getattr(tokenize, ‘“’”‘open’“‘”’, open)(__file__);code=f.read().replace(‘“’”‘\r\n’“‘”’, ‘“’”‘\n’“‘”’);f.close();exec(compile(code, __file__, ‘“’”‘exec’“‘”’))' install --record /tmp/pip-record-7n8tvfkb/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.8/fbprophet Check the logs for full command output.

请注意,运行我提供的两个命令总是会产生错误,但它们并不重要。在 fbprophet 解决这些小错误之前升级 setuptools 并安装依赖项。上面显示的错误不同,和gcc有关,而且只发生在某些人身上。

可选的附加问题:

  • 我们如何解决它?
  • 我们如何防止出现这种不可重现的结果?
  • 升级 docker 引擎版本会破坏容器吗?

【问题讨论】:

  • docker 版本的差异可能不会影响这个问题。因为它出现了我的环境,docker 版本 19.03.13,Ubuntu 20.04。
  • 如果你在你的 docker 上没有你关心的东西,你应该试试docker rm -f $(docker ps -aq) && docker system prune --all --volumes。然后在您的 Mac 上再试一次。我确实看到了与我身边的同事相同的行为(带有最新 docker daemon 的 Big Sur)
  • 这个标签的图片可能发生了变化。你能比较一下你的两个docker images 结果吗?
  • @GermanCapuano 与检查ID相同,与检查标签不同,因为标签可以更新为新ID。
  • @GermanCapuano 你的同事什么都不应该做,他的行为是正确的。 应该运行这些命令

标签: python docker pip facebook-prophet


【解决方案1】:

我们该如何解决?

您的错误报告了 GCC / 编译问题。
快速搜索显示主要与 python / gcc 版本相关的问题(onetwothree)。
但你是对的,这看起来不像是发生在一个特定的容器内。

所做的看起来像是某种OOM problem

另外,这是一个虚拟机吗? Stan 需要大量内存才能 编译模型,如果内存不足,可能会出现此错误 正在编译时。

我做了一些测试。
在我的机器上,编译过程消耗了高达 2.4 Gb 的 RAM。

cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

uname -r
3.10.0-1160.6.1.el7.x86_64

docker --version
Docker version 20.10.1, build 831ebea

# works fine
docker run --rm -it -m 3G python:3.8.6 /bin/bash

# fails with error: command 'gcc' failed with exit status 1
# actually it was killed by OOM killer
docker run --rm -it -m 2G python:3.8.6 /bin/bash

# yes, here he is
tail -f /var/log/messages | grep -i 'killed process'
Dec 22 08:34:09 cent7-1 kernel: Killed process 5631 (cc1plus), UID 0, total-vm:2073600kB, anon-rss:1962404kB, file-rss:15332kB, shmem-rss:0kB
Dec 22 08:35:56 cent7-1 kernel: Killed process 5640 (cc1plus), UID 0, total-vm:2056816kB, anon-rss:1947392kB, file-rss:15308kB, shmem-rss:0kB

在有问题的机器上检查 OOM 杀手日志。
是否有足够的内存供 Docker 使用?


升级 docker 引擎版本会破坏容器吗?

一般情况下,情况并非如此。
但是对于v20.10.0,Docker 引入了非常大的一组changes,与内存和cgroups 相关。

在排除所有明显的原因(比如你朋友的机器没有足够的内存)之后,你可能需要深入了解与内存/cgroups/等相关的 docker 守护进程设置。


同一个容器如何在两台电脑上产生不同的结果?

嗯,从技术上讲,这是完全可能的。
容器化程序still use host OS kernel.
并非所有内核设置都是“命名空间”的,即。 e.可以专门为一个特定的容器设置。
其中很多(实际上是大多数)仍然是全局的,并且会影响您的程序的行为。

虽然我认为这与您的问题无关。
但是对于依赖于特定内核设置的复杂程序,必须考虑到这一点。

【讨论】:

  • 哦,哇!那是回忆。他增加了内存,它起作用了!!!!似乎我们碰巧遇到了 RAM 限制,而 docker 中的差异足以让一个失败而不是另一个失败。
【解决方案2】:

This is solution。这个问题不仅仅是docker上的问题,而是fbprophet本身造成的。为了避免:

docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet

【讨论】:

  • 我们试过了。它没有解决它。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2023-01-08
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多