我有两个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
由于未安装在pdf中,因此该命令不存在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 "$@"
}
因此,当pdflatex
被调用时pandoc
,容器将启动并进行转换。
但是,当使用2个容器时,如何为该pdflatex
命令添加别名以模拟仅包含该容器的容器中的命令pandoc
?
我看了一下docker-compose
,因为我已经使用它来使2个容器进行通信(应用程序与数据库进行通信)。我什至考虑过-
ssh
从容器A到容器B调用该pdflatex
命令,但这绝对不是正确的解决方案。
最后,我还构建了一个包含pandoc
+
的图像pdflatex
(之所以起作用是因为两个可执行文件位于同一图像上),但是我真的想单独保存这两个图像,因为它们可以被其他图像独立使用。
类似的问题被暴露在这里,我的理解所提供的答案需要泊坞窗要在容器中的安装,需要一个泊坞窗插座结合(/var/run/docker.sock
主机和容器答:我不认为之间),这是最好的做法,这似乎是一个会造成安全问题的黑客。
您的问题有多种解决方案,我让您选择最适合您的一种。下面列出了从最干净到最丑陋的内容(我认为是关于一般遵循的最佳做法)。
如果您最终经常调用它, 则值得将pandoc公开为(HTTP)API 。一些图像已经做到了这一点,例如metal3d / pandoc-
server
(我已经成功使用了它,但是我确定您可以找到其他图像)。
在这种情况下,你只要运行一个容器pandoc
+ pdflatex
一次 便大功告成!
让2个图像:一个pandoc
只,另外一个用pandoc
+ pdflatex
,
继承了第一个与FROM
该指令Dockerfile
。
它将解决您对大小的担忧,并且仍然能够运行pandoc而无需获取pdflatex
。然后,如果您需要使用拖动图像pdflatex
,它将只是
一个额外的图层 ,而不是整个图像。
如果您发现自己经常使用该图像,而很少使用没有该图像的情况,则也可以用另一种方法进行处理,即使用基本图像,pdflatex
然后添加其他图像。你也可以将3张图片,,,和,覆盖每一个需要你可能有,但随后你将至少有一个是不以任何方式链接到2人(不能heritate一个“孩子”形象图片),使其难以维护。pandoc``pdflatex``pandoc``pdflatex``pandoc``pdflatex``pdflatex + pandoc
my-pandoc-image
+ Docker套接字安装中的Docker客户端这是您在文章结尾处提到的解决方案,它可能是调用其他容器化命令的最 通用, 最 直接的解决方案 ,而不是将pandoc
+
的确切用例pdflatex
考虑在内。
只需将docker客户端添加到您的映像中,my-pandoc-image
然后使用即可在运行时将Docker套接字作为卷传递docker run -v /var/run/docker.sock:/var/run/docker.sock
。如果您担心不能够做出pandoc
的呼叫docker run ...
,而不是pdflatex
直接,只需添加一个贫穷的包装称为pdflatex
在/usr/local/bin/
其负责做的docker run
这可能是我在这里要讲的 不太干净的内容
。你可以尝试让无论是pandoc
二进制pdflatex
容器或pdflatex
二进制文件中pandoc
使用的容器--volumes- from
把一切都打包在自己的码头工人的形象。但总而言之,它更像是胶带而不是真正的解决方案。
您可以选择最适合您需求的解决方案,但我建议您使用前两种,强烈建议不要使用后一种。
问题内容: 我基于两个不同的图像创建了两个docker容器。一个数据库,另一个用于网络服务器。这两个容器都在我的Mac OS X上运行。 我可以从主机访问数据库容器,也可以从主机访问Web服务器。 但是,如何从Web服务器访问数据库连接? 我启动数据库容器的方式是 我开始了wls容器作为 我可以通过连接到主机上的数据库 我可以以以下方式访问主机上的wls: 问题答案: 最简单的方法是使用–link
我基于两个不同的映像创建了两个docker容器。一个是db,另一个是WebServer。这两个容器都在我的mac OSX上运行。 我可以从主机访问db容器,也可以从主机访问webserver。 我可以访问主机上的wls作为
我们有一个公开REST API的现有java应用程序。当它收到超文本传输协议请求时,它使用Runtime.getRuntime(). exe启动另一个java进程。 我们正在将此应用程序迁移到docker,我们希望将这些服务、一个容器中的REST应用程序和另一个容器中的其他组件分开。 有没有办法,REST应用程序可以在另一个docker容器中启动另一个应用程序?
问题内容: 有两个容器A和B。一旦容器A启动,将执行一个过程,然后容器将停止。容器B只是一个Web应用程序(例如expressjs)。是否可以从容器B启动A? 问题答案: 可以向Docker授予容器访问权限,以便它可以在主机上生成其他容器。您可以通过在容器内部暴露docker套接字来执行此操作,例如: 现在,如果容器中有可用的客户端,则可以控制主机上的docker守护程序,并使用它生成“容器A”。
问题内容: 我想创建一个包含一个或多个容器的Docker容器。Docker有可能吗? 问题答案: 在docker内部运行docker绝对是可能的。最主要的是,您将外部容器具有额外的特权(以开头),然后在该容器中安装docker。 查看此博客文章以获取更多信息:Docker-in-Docker。 本条目中描述了一种可能的用例。该博客介绍了如何在Jenkins Docker容器中构建Docker容器。
问题内容: 我正在尝试为将我的应用程序容器连接到postgres容器提供一个便携式解决方案。“便携式”是指我可以给用户两个命令,每个容器一个,它们将始终协同工作。 我的本地PC上运行着一个postgres docker容器,我这样运行它, 我可以使用address从python flask应用程序访问它。 我也将python应用程序也放置在docker容器中,但无法连接到postgres容器。 地