Docker exec命令非常缓慢。

4
我已经构建了一个Docker容器系统,其中包含一个命令行应用程序。 我使用另一个应用程序通过传递参数并使用docker exec命令来运行该应用程序。
当我在Docker内部运行命令行应用程序时,它需要0.003秒才能运行。 $ time comlineapp “hello”
但是当我使用docker exec从Docker外部运行它时,需要0.500秒。 $ time docker exec comline app “hello”
因此,显然docker exec需要很长时间。我们需要任何帮助来尽可能减少docker exec命令的时间。
以下是Docker文件:
FROM ubuntu:18.04

RUN adduser --disabled-password --gecos "" newuser

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get -y install time && \
    apt-get -y install gcc mono-mcs && \
    apt-get install pmccabe && \
    rm -rf /var/lib/apt/lists/*

所有必需的软件已经安装完毕。


请问您能分享一下您的Dockerfile吗?在容器启动时,您是否安装软件或执行其他操作以准备启动应用程序? - Turing85
我已经更新了问题,并提供了 Docker 文件的详细信息。所有必需的软件已经安装完成。我所说的应用程序是 gcc,我从外部调用它。 - user1235483
1
我有类似的担忧,但是我只得到了170毫秒的开销。我还没有任何想法,但是我运行了strace(strace -ttt -T -f docker exec ...),并且它提供了有趣的提示。此外,我了解到docker CLI实际上使用HTTP协议访问docker引擎,这也可能是开销的原因。 - Kuchara
@Kuchara,你对此有了更进一步的了解吗? - Dax Fohl
这里有答案:https://stackoverflow.com/questions/64894654/is-there-a-way-to-speed-up-docker-exec/64895568#64895568 - Dax Fohl
2个回答

2

当您从docker外部发送请求时,会有(多个)API请求通过unix套接字,并且为进程本身进行了大量的额外设置,例如应用seccomp配置文件、设置命名空间、降低权限等。

利用docker的正确方法是在其中创建一个服务,然后让端点处理这些问题。一个简单的Python服务应该能够胜任这项工作。我们在平台上做了同样的改变,节省了数千毫秒的时间。


0
在我的情况下,我发现运行journalctl -u docker.service | tail -n 50时出现了问题,抛出了以下错误:

level=error msg="failed to get longest-active member" error="failed to find longest active peer"

通过使用命令docker swarm leave退出Docker Swarm,并使用docker swarm init重新启动它,问题得到了解决。

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