使本地文件夹在运行时在 dockerfile 中可用

问题描述 投票:0回答:1

我有一堆 docker 容器,其中包含一些命令行工具。

我的目标是让它们表现得像命令行工具一样。

例如,理想情况下,我会将它们运行为:

docker run tool --input inputfile --output outputfile

这与本地安装该工具仅略有不同,但更便携。我已经将

tool
定义为能够传递输入参数的入口点。但是,仍然存在一个问题,即
inputfile
outputfile
被解释为 within docker 镜像。

从手册中,

copy
add
是构建时指令,因此当将容器作为命令行工具运行时它们将不起作用(只要我正确阅读手册)。

一种解决方案是在运行时将本地文件夹映射到容器文件夹,例如(来自手册):

docker run -v $(pwd):$(pwd) -w $(pwd) samtools tool --input inputfile --output outputfile

这很好,使得该工具的行为看起来几乎就像是在“本地”运行,而不是在容器后面运行,但对于命令行使用来说也有点尴尬。有没有办法将此指令包含在 Dockerfile 中?

docker dockerfile command-line-interface
1个回答
0
投票

如果该工具位于 docker 内部,但您想在主机级别使用它,唯一的方法是像您一样使用卷(-v ...)

如果您想降低

docker run ...
的复杂性,您可以将其包装在脚本中并使用“$@”传播所有参数。

按照以下步骤重现我所说的内容

  • 创建一个包含 bash 脚本(内部)的容器,名为internal-tool.sh,并位于 /workspace 中,内容如下:
echo "arguments are"
echo "$@"
  • 从容器内部运行它。结果应该是

  • 然后从主机调用它。结果应该是一样的
docker exec -it reverent_meninsky bash /workspace/internal-tool.sh foo bar

  • 在主机中,在某些电子文件夹(如 /tmp/sandbox)中创建名为 external-tool-sh 的包装器,其中包含以下内容:
docker exec -it reverent_meninsky bash /workspace/internal-tool.sh "$@"
  • 有了这个,调用内部工具就可以方便一点了

bash external-tool.sh foo bar

更简单

您可以创建指向外部工具的链接并将其添加到 PATH 中,以使其更加简单并可从操作系统中的任何位置使用。对于这个示例,我将调用 walle 来使用我的工具

ln -s external-tool.sh walle
chmod +x walle

然后在另一个shell中:

export TOOL_HOME=/tmp/sandbox
export PATH=$PATH:$TOOL_HOME

最后你可以用

walle foo bar
调用脚本,结果是一样的

讲座

© www.soinside.com 2019 - 2024. All rights reserved.