我已将(假设的)程序dhprog
上传到Docker Hub,它的工作原理如下:
docker run -v "$PWD:/workdir" -u "$(id -u):$(id -g)" --rm -it dhuser/dhimage dhprog arg1 arg2
该程序的非docker化版本的工作原理如下:
dhprog arg1 arg2
我有-v
因为我想在容器中将当前目录设为/workdir
(如果arg1
是容器外的文件名,那么dhprog
在容器中可以读取该文件)。
我有-u
因为我想在容器中以非root身份运行dhprog
,如果arg2
是输出文件名,则应将其写入容器外部作为已调用docker run
命令的相同UID和GID。
如何在不牺牲2个功能(读取和写入容器外的文件)的情况下,为用户缩短docker run
命令行,尤其是-v
和-u
标记)并将文件作为非root用户写入容器外部,但作为调用用户?
答案 0 :(得分:1)
这里唯一真正的选择是分发一个shell脚本,为你包装所有这些。例如,创建一个名为dhprog
的shell脚本,如下所示:
#!/bin/sh
exec docker run -v "$PWD:/workdir" -u "$(id -u):$(id -g)" \
--rm -it dhuser/dhimage dhprog "$@"
我会避免使用bash别名,因为在很多情况下这些别名都不可用,而$PATH
中的脚本就像任何其他二进制文件一样。
答案 1 :(得分:1)
使用" install"创建一个脚本。您的命令作为用户主目录中的本地脚本。
使用您拥有的域或在通过rawgit等服务公开的存储库中将其作为纯文本页面在线发布。
现在您可以使用这样的复制和粘贴代码分发它:
curl -s" http://example.com/dhprog" | bash的
今天有很多这种方法的例子,你可以看到例如以上述相同方式运行的sdkman installation script。
现在,用户的shell中会有dhprog
。
奖励:如果你擅长编写脚本,你甚至可以强制用户shell在每次创建新shell时检查你的程序(脚本)的更新(例如,像oh-my-zsh一样) )。
答案 2 :(得分:1)
Sparrow对于这样的任务非常方便:
$ cat story.bash
set -e
path=$(config path)
docker run -v "$path:/workdir" -u "$(id -u):$(id -g)" \
--rm -it dhuser/dhimage dhprog \
$(cli_args)
$ cat sparrow.json
{
"name" : "docker-dhprog",
"version" : "0.0.1"
}
$ sparrow plg upload
在安装了麻雀的其他服务器上,只需:
$ sparrow plg install docker-dhprog
$ sparrow plg run docker-dhprog --param path=$PWD -- arg1 arg2