我有两个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的黑客。
答案 0 :(得分:6)
您的问题有多种解决方案,我会让您选择最适合您的问题。它们如下所示,从最清洁到最丑陋(在我看来,关于通常遵循的最佳实践)。
如果您最终经常调用它,可能值得将pandoc公开为(HTTP)API 。有些图片已经这样做了,例如metal3d/pandoc-server(我已经成功使用了,但我相信你可以找到其他图片)。
在这种情况下,您只需运行一个pandoc
+ pdflatex
一次的容器,然后就可以了!
制作2张图片:一张只有pandoc
,另一张带有pandoc
+ pdflatex
,继承第一张带有FROM
指令的图片Dockerfile
强>
它将解决您对大小的担忧,并且仍然可以运行pandoc而无需获取pdflatex
。然后,如果您需要使用pdflatex
提取图像,则只需一个额外的图层,而不是整个图像。
如果您发现自己经常单独使用pdflatex
图片并且很少使用{{}},您也可以使用基本图片pandoc
和另一个添加pdflatex
的方式执行此操作{1}}图片没有pandoc
。您还可以制作3张图片pdflatex
,pandoc
和pdflatex
,以满足您的所有需求,但之后您将至少拥有一张未链接的图片任何方式与其他2人(不能侮辱“孩子”的形象),使其更难维护。
pdflatex + pandoc
+ 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
这个可能是不太干净我将在这里介绍。您可以使用/usr/local/bin/
尝试获取docker run
容器中的pandoc
二进制文件或pdflatex
容器中的pdflatex
二进制文件,以便将所有内容打包在自己的Docker中图片。但是,诚然,它更像是一个胶带,而不是一个真正的解决方案。
您可以选择最适合您需求的解决方案,但我会建议前两个,并强烈反对最后一个。