我有一堆 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 内部,但您想在主机级别使用它,唯一的方法是像您一样使用卷(-v ...)
如果您想降低
docker run ...
的复杂性,您可以将其包装在脚本中并使用“$@”传播所有参数。
按照以下步骤重现我所说的内容
echo "arguments are"
echo "$@"
docker exec -it reverent_meninsky bash /workspace/internal-tool.sh foo bar
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
调用脚本,结果是一样的