【问题标题】:How to specify user and group owner of a mounted device in Docker container?如何在 Docker 容器中指定已挂载设备的用户和组所有者?
【发布时间】:2021-05-01 10:14:16
【问题描述】:

我正在使用VSCode Devcontainer 并且:

  • 我需要从容器内访问/dev/kvm
  • 我不希望容器中的用户是root

所以,我用--device=/dev/kvm 启动容器,我可以访问它,但是我不能使用它,因为它归root主机的kvm 组所有 .

vscode@c017a6dc1bc0:/workspaces/project$ ls -l /dev/kvm
crw-rw---- 1 root 108 10, 232 May  1 09:56 /dev/kvm

108 id 对应于主机上的kvm 组,但它没有映射到容器中的任何内容。即使我创建了kvm 组,它也不起作用。而且我不想硬编码108,因为如果我在另一台计算机上使用 Dockerfile,这是不可靠的。

一种可能是在容器内运行chown myuser /dev/kvm,但myuser 是非root 用户,我希望kvm 设备在容器启动后自动可用。

我知道 VScode 中存在 postCreateCommand,但它也不会以 root 身份执行,因此不允许我更改 /dev/kvm 的组。

FROM ubuntu:20.04

ARG USERNAME=myuser
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN groupadd --gid $USER_GID $USERNAME \
    && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
    # && groupadd -r kvm \
    # && adduser $USERNAME kvm \
    # && gpasswd -a $USERNAME kvm

USER $USERNAME
{
    "name": "Test container",
    "build": {
        "dockerfile": "Dockerfile"
    },
    "settings": {
        "terminal.integrated.shell.linux": "/bin/bash"
    },
    "remoteUser": "myuser",
    "runArgs": [
        "--device=/dev/kvm"
    ]
}

在这种情况下,最佳做法是什么?我应该以某种方式将/etc/group 安装在容器或其他东西中吗?有没有办法从Dockerfile 更改命令行挂载的设备的组所有者?

【问题讨论】:

  • 在阅读此问题并查看解决问题的 Dockerfile 更改后,我能够得到一些工作:github.com/Linutronix/elbe/issues/164
  • 谢谢@pestophagous。我在做同样的事情,我猜:ARG KVM_GID=108 然后RUN groupadd -g $KVM_GID kvm && adduser $USERNAME kvm。缺点是组 ID 可能会从一个发行版更改为另一个发行版。

标签: docker visual-studio-code dockerfile vscode-remote vscode-devcontainer


【解决方案1】:

我找到了一个hacky解决方案:我在容器中安装了sudo,并允许非root用户在没有密码的情况下执行chgrp,然后将sudo chgrp myuser /dev/kvm添加到我的入口点脚本中。

这里是 jenkins 的 kvm 访问示例:

FROM jenkins/jenkins:2.339-jdk11
USER root

RUN apt-get update && apt-get install -y sudo && \ 
    rm -rf /var/lib/apt/lists/* && \
    echo "jenkins ALL = (root) NOPASSWD: /bin/chgrp" >> /etc/sudoers

USER jenkins

COPY initscript.sh /initscript.sh

ENTRYPOINT [ "/initscript.sh" ]

还有初始化脚本文件

#!/bin/bash
sudo chgrp jenkins /dev/kvm
/sbin/tini -- /usr/local/bin/jenkins.sh

也许这也适用于您的设置。

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2020-01-02
    • 1970-01-01
    • 2016-07-11
    • 2015-01-20
    相关资源
    最近更新 更多