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

前端之家收集整理的这篇文章主要介绍了Docker:容器A可以调用位于其他容器B上的可执行文件吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有两个Docker镜像,一个包含pandoc(一个实用程序,用于将不同格式的文档转换为多种格式),另一个包含pdflatex(从texlive开始,将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(必须在$PATH中)来生成pdf,但pdflatex不存在,因为它未安装在my-pandoc-image中.

就我而言,pdflatex安装在图像my-texlive-image中.

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

我很确定这是可能的,因为如果我在我的主机上安装pandoc(没有pdflatex),我可以运行pandoc -s test.md – latex-engine = pdflatex -o test.pdf,只需将pdflatex命令别名:

pdflatex() {
    docker run --rm \
        -v $(pwd):/texlive \
        my-texlive-image \
        pdflatex "$@"
}

因此,当pandoc调用pdflatex时,容器会启动并执行转换.

但是当使用2个容器时,我怎么能将pdflatex命令别名来模拟它在只有pandoc的容器上的存在?

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

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

编辑:

一个类似的问题暴露在here,因为据我所知,提供的答案需要在容器A上安装Docker,并且需要在主机和容器A之间使用docker socket绑定(/var/run/docker.sock).我不认为这是最好的做法,它似乎是一个可以创建@L_502_4@的黑客.

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

1.使它成为一项服务

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

在这种情况下,您只需使用pandoc pdflatex运行一个容器就可以了!

2.使用图像继承!

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

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

如果您发现自己经常单独使用pdflatex图像而很少使用没有pdflatex的pandoc图像,您也可以使用基本图像pdflatex和另一个添加pandoc的方式执行此操作.你也可以制作3张图片,pandoc,pdflatex和pdflatex pandoc,以满足你可能拥有的每一个需求,但是你将至少有一张图像没有以任何方式与其他2张相连(不能冥想一个“孩子”的形象),使其更难维护.

3.我的pandoc-image Docker套接字安装中的Docker客户端

这是您在帖子末尾提到的解决方案,它可能是调用其他容器化命令的最通用和直接的解决方案,而不是考虑到pandoc pdflatex的精确用法.

只需添加docker client tu your your my-pandoc-image并使用docker run -v /var/run/docker.sock:/var/run/docker.sock在运行时将Docker套接字作为卷传递.如果您担心无法使用pandoc调用docker run …而不是直接使用pdflatex,只需在/usr/local / bin /中添加一个名为pdflatex的糟糕包装器,它将负责执行docker run

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

这可能是我在这里不太干净的.您可以尝试使用–volumes-from获取pdflatex容器中的pandoc二进制文件或pandoc容器中的pdflatex二进制文件,以便将所有内容打包在自己的Docker镜像中.但诚然,它更像是一个胶带而不是一个真正的解决方案.

结论

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

猜你在找的Docker相关文章