Docker:容器A可以调用位于其他容器B上的可执行文件吗?
我有两个Docker镜像,一个包含 我可以分别运行每个图像:
但是,实际上,我想要的是直接调用pandoc(从容器中)将md转换为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命令别名:
因此,当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).我不认为这是最好的做法,它似乎是一个可以创建security issues的黑客. 最佳答案
您的问题有多种解决方案,我会让您选择最适合您的问题.它们如下所示,从最清洁到最丑陋(在我看来,关于通常遵循的最佳实践).
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镜像中.但诚然,它更像是一个胶带而不是一个真正的解决方案. 结论 您可以选择最适合您需求的解决方案,但我会建议前两个,并强烈反对最后一个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |