两台主机运行相同的 Docker 命令出现差异

7

我和同事遇到了一个棘手的Docker难题。

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

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

对我来说,它可以完美安装,但他却出现错误并无法安装。我认为docker的整个意义在于防止这种问题,所以我真的很困惑。
以下是更多详细信息,但我的主要问题是:
- 我们如何得到不同的结果?
更多细节:
我们都在新的MacBook Pro上运行Docker,配置相似,都是Catalina。他的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引擎版本可能会破坏容器吗?

注:本文中的"fbprophet"是一个Python库

2
Docker版本的差异可能不会影响此问题。因为它出现在我的环境中,即Docker版本19.03.13,Ubuntu 20.04。 - Akihito KIRISAKI
2
如果您的 Docker 上没有任何重要数据,可以尝试运行命令 docker rm -f $(docker ps -aq) && docker system prune --all --volumes。然后在您的 Mac 上再次尝试。我在我的电脑上也看到了与您同事相同的情况(Big Sur 操作系统,最新版本的 Docker 守护程序)。 - β.εηοιτ.βε
1
也许此标签的图像已更改。您能比较一下您的两个 docker images 结果吗? - Danny Varod
2
@GermanCapuano 与检查标签不同,它是检查ID,因为标签可以更新为新的ID。 - Danny Varod
1
@GermanCapuano,你的同事不需要做任何事情,他的行为是正确的。应该运行这些命令。 - β.εηοιτ.βε
显示剩余6条评论
2个回答

13

我们该怎么修复它?

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

它看起来像是某种OOM问题

另外,这是一个虚拟机吗?Stan需要大量内存来编译模型,如果你运行时内存不足就会出现这个错误。

我进行了一些测试。
在我的机器上,编译过程最多消耗了2.4 GB的内存。

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引入了涉及内存和cgroups的非常大的一组更改

在排除所有明显原因(例如您的朋友的计算机没有足够的内存)之后,您可能需要深入研究与内存/ cgroups /等相关的docker守护程序设置。


为什么同一个容器在两台计算机上可以产生不同的结果?

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

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


哦,哇!!原来是内存的问题。他增加了内存,然后就可以正常工作了!!看起来我们可能差点超出了 RAM 的限制,而 docker 之间的差异足以导致其中一个失败而另一个没有。 - German Capuano

1

这是解决方案。这个问题不仅仅涉及到docker,而且fbprophet本身也会引起这个问题。为了避免这种情况:

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

我们尝试过了,但并没有解决问题。感谢您的建议。 - German Capuano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接