【问题标题】:Assigning additional capabilities using a Docker file使用 Docker 文件分配附加功能
【发布时间】:2018-11-21 23:39:07
【问题描述】:

我需要部署 Docker 镜像,但我只想使用 Docker 运行命令而不使用它的任何参数。

我想在运行容器时分配特殊权限。

这是我的 Docker 运行命令:

docker run --cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH ping

但我只想使用:

docker run ping

我应该对我的 Docker 文件进行哪些更改?我不能使用 Docker Compose(不是我的用例)。

我的 Docker 文件:

【问题讨论】:

  • Imgur 图片链接已损坏(尽管可能是也可能不是由于临时中断)。利用这个机会发布文本。提前致谢。
  • @freedev 下面的回答很有帮助...

标签: docker dockerfile


【解决方案1】:

写一个像/usr/local/sbin/docker-ping.sh这样的脚本:

#!/bin/sh

docker run --cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH ping

然后是另一个脚本,/usr/local/bin/docker-ping:

#!/bin/sh

sudo /usr/local/sbin/docker-ping.sh

最后适当修改sudo。

【讨论】:

  • 修改sudo是什么意思?
  • 您可以将 sudo 配置为仅允许用户运行特定命令。正常配置将允许用户运行所有允许用户运行任意 docker 命令的命令。适当的 sudo 配置将允许用户只运行 '/usr/local/sbin/docker-ping.sh'
【解决方案2】:

你不能那样做。映像不能授予自己提升的权限来控制其运行的系统;只有实际运行docker run 的管理员才能做到这一点。

最好将其包装在 Docker Compose YAML 文件或包含所有必需的 docker run 参数的 shell 脚本中。

如果您尝试通过 Docker 构建“辅助命令”,有两件事值得记住。一是每个可以运行 Docker 命令的人都对主机拥有不受限制的 root 权限;很难阻止某人来自docker run -v /:/host -u root ... 并不受限制地访问主机的文件系统。另一个是有很多像这样的 Docker 选项(包括设置环境变量、卷挂载和发布端口)是非常常规地设置的,所以很难构建一个只有 docker run imagename 自己的镜像来完整的镜像功能。

【讨论】:

    【解决方案3】:

    如果系统中存在 docker 组,可能不需要使用 sudo 命令。如this link 所述,附加组 docker,并将您的用户添加到组中。这将避免使用 sudo。我刚刚测试了其他特权命令,它们对我来说没有任何问题。重复上述步骤:

    sudo groupadd docker
    sudo usermod -aG docker $USER
    

    需要重启docker守护进程才能使上述生效,或者重启机器。

    顺便说一句,据我所知,最好的选择是使用 shell 脚本启动。前面指出的方法很好,但我会写另一种方法,它允许传递任意参数,并且对于您可能需要的任何命令都更通用。

    文件:privileged-wrapper.sh

    #!/bin/bash
    IMAGE_NAME="your_image_name"
    BINARY="$0"
    BINARY="${BINARY#./}"
    docker run --cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH --rm "$IMAGE_NAME" "$BINARY" "$@"
    

    现在,您可以创建许多符号链接作为这些功能所需的命令(请记住,符号链接的名称是要启动到容器中的命令)。预计要在 PATH 中找到要启动的命令。

    chmod a+x privileged-wrapper.sh
    ln -svf privileged-wrapper.sh ping
    

    终于启动了:

    ./ping -c 10
    

    【讨论】:

      【解决方案4】:

      你可以用 docker-compose 做到这一点。

      这适用于版本 2 和 3。例如:

      version: '2'
      services:
        myapp:
          cap_add:
          - SYS_ADMIN
          - DAC_READ_SEARCH
      

      【讨论】:

      • 感谢@freedev!
      猜你喜欢
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2016-03-29
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多