如何让docker run命令行缩短为用户?

时间:2017-10-11 15:36:07

标签: linux docker

我已将(假设的)程序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用户写入容器外部,但作为调用用户?

3 个答案:

答案 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)

  1. 使用" install"创建一个脚本。您的命令作为用户主目录中的本地脚本。

  2. 使用您拥有的域或在通过rawgit等服务公开的存储库中将其作为纯文本页面在线发布。

  3. 现在您可以使用这样的复制和粘贴代码分发它:

    curl -s" http://example.com/dhprog" | bash的

  4. 今天有很多这种方法的例子,你可以看到例如以上述相同方式运行的sdkman installation script

    1. 现在,用户的shell中会有dhprog

    2. 奖励:如果你擅长编写脚本,你甚至可以强制用户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