Docker:容器A可以调用位于其他容器B上的可执行文件吗?

时间:2017-04-16 21:20:01

标签: docker docker-compose pandoc pdflatex

我有两个Docker镜像,一个包含pandoc(用于将不同格式的文档转换为多种格式的实用程序),另一个包含pdflatex(来自texlive,以转换{ {1}}文件到tex)。我的目标是将文档从pdf转换为md

我可以单独运行每个图像:

pdf

但实际上,我想要的是直接调用# call pandoc inside my-pandoc-image (md -> tex) docker run --rm \ -v $(pwd):/pandoc \ my-pandoc-image \ pandoc -s test.md -o test.tex # call pdflatex inside my-texlive-image (tex -> pdf) docker run --rm \ -v $(pwd):/texlive \ my-texlive-image \ pdflatex test.tex # generates test.pdf (来自其容器)将pandoc转换为md,如下所示:

pdf

此命令在此处不起作用,因为容器内的docker run --rm \ -v $(pwd):/pandoc \ my-pandoc-image \ pandoc -s test.md --latex-engine pdflatex -o test.pdf 尝试调用pandoc(必须在pdflatex中)才能生成pdf,但$PATH会不存在,因为它未安装在pdflatex

就我而言,my-pandoc-image已安装在图片pdflatex中。

因此,从这个例子中,我的问题是:容器A可以调用位于其他容器B上的可执行文件吗?

我很确定这是可行的,因为如果我在我的主机上安装my-texlive-image (没有pandoc),我可以通过简单的别名来运行pdflatex pandoc -s test.md--latex-engine=pdflatex -o test.pdf命令:

pdflatex

因此,当pdflatex() { docker run --rm \ -v $(pwd):/texlive \ my-texlive-image \ pdflatex "$@" } 调用pdflatex时,容器会启动并进行转换。

但是当使用2个容器时,如何对pandoc命令进行别名以模拟它仅存在pdflatex的容器?

我查看了pandoc,因为我已经用它来制作2个容器进行通信(应用程序与数据库进行通信)。我甚至考虑过从容器A到容器B的docker-compose来调用ssh命令,但这绝对是not the right solution

最后,我还构建了一个包含pdflatex + pandoc的图像(因为两个可执行文件位于同一图像上,所以它有效),但我真的想分别保留2个图像,因为它们可以被其他图像独立使用。

编辑:

类似的问题是公开的here,因为据我所知,提供的答案需要在容器A上安装Docker,并且需要在主机和容器A之间绑定一个docker socket(pdflatex)。我不知道#39;认为这是最佳做法,它似乎是一种可以创建security issues的黑客。

1 个答案:

答案 0 :(得分:6)

您的问题有多种解决方案,我会让您选择最适合您的问题。它们如下所示,从最清洁到最丑陋(在我看来,关于通常遵循的最佳实践)。

1。使其成为一项服务

如果您最终经常调用它,可能值得将pandoc公开为(HTTP)API 。有些图片已经这样做了,例如metal3d/pandoc-server(我已经成功使用了,但我相信你可以找到其他图片)。

在这种情况下,您只需运行一个pandoc + pdflatex 一次的容器,然后就可以了!

2。使用图像继承!

制作2张图片:一张只有pandoc,另一张带有pandoc + pdflatex继承第一张带有FROM指令的图片Dockerfile

它将解决您对大小的担忧,并且仍然可以运行pandoc而无需获取pdflatex。然后,如果您需要使用pdflatex提取图像,则只需一个额外的图层,而不是整个图像。

如果您发现自己经常单独使用pdflatex图片并且很少使用{{}},您也可以使用基本图片pandoc和另一个添加pdflatex的方式执行此操作{1}}图片没有pandoc。您还可以制作3张图片pdflatexpandocpdflatex,以满足您的所有需求,但之后您将至少拥有一张未链接的图片任何方式与其他2人(不能侮辱“孩子”的形象),使其更难维护。

3。 pdflatex + pandoc + Docker套接字挂载

中的Docker客户端

这是您在帖子末尾提到的解决方案,它可能是用于调用其他容器化命令的最强通用且简单的解决方案,而不是您{{1}的精确用例} + my-pandoc-image被考虑在内。

只需添加docker client tu your your image pandoc并使用pdflatex在运行时将Docker套接字传递为卷。如果您担心无法直接my-pandoc-image拨打docker run -v /var/run/docker.sock:/var/run/docker.sock而不是pandoc,请在docker run ...中添加一个名为pdflatex的不良包装,将负责pdflatex

4。使用volumes-from获取二进制文件

这个可能是不太干净我将在这里介绍。您可以使用/usr/local/bin/尝试获取docker run容器中的pandoc二进制文件或pdflatex容器中的pdflatex二进制文件,以便将所有内容打包在自己的Docker中图片。但是,诚然,它更像是一个胶带,而不是一个真正的解决方案。

结论

您可以选择最适合您需求的解决方案,但我会建议前两个,并强烈反对最后一个。