【问题标题】:Make an existing Docker container rootless使现有的 Docker 容器无根
【发布时间】:2021-11-09 18:28:30
【问题描述】:

我不是在问如何从头开始创建无根容器。相反,我得到了一些部署为默认以 root 身份运行的预构建 Docker 容器映像的软件。我需要修改这些容器,以便它们可以部署在 Kubernetes 上,这意味着我需要使这些容器无根。需要明确的是,我没有这些容器的来源,所以我不能简单地从头开始重建它们。

我发现了很多关于构建无根容器的文章,但它们都假设您是从头开始构建容器的。我花了几个小时搜索,但找不到任何关于将现有容器修改为无根的内容。

我意识到这可能是一个非常开放的问题,但我不知道我需要考虑的所有事情。我能够收集到的两件事是在 Dockerfile 中添加诸如 USER 1000 之类的行,以及调整某些文件和文件夹的所有权和权限。除此之外,我不确定我需要做什么。

【问题讨论】:

  • 你不是在找securityContext.runAsUser吗? kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/…
  • 相当于@AliTou提到的Kubernetes选项,如果你只是docker run --user 12345 the-preexisting-image会发生什么?
  • 到目前为止,我已经将几个容器转换为无根容器。主要问题是文件权限,容器中的所有内容都归根用户所有。所以我只是以 USER 1000 的身份运行,并根据需要更改文件和文件夹的所有权和权限,这似乎是有效的。我真的很希望能找到有关此主题的更多信息,但是当需要使预先存在的图像无根时,这似乎是一种罕见的情况。

标签: docker kubernetes containers rootless


【解决方案1】:

在容器中创建用户并切换用户;

 Add a new user, named user;
 Let this user have root privileges;
 Set its password to password;
 After the Container is started, log in as user and go directly to the user's home directory;

将以下代码 sn-p 放入 Dockerfile 中。

RUN useradd --create-home --no-log-init --shell /bin/bash user \
&& RUN adduser user sudo \
&& RUN echo 'user:password' | chpasswd

USER user
WORKDIR /home/user

使用fixuid修改容器内非root用户的uid和gid;

用上述代码创建非root用户后,用户的uid和gid一般为1000:1000。

Docker和宿主机共用一套内核,而内核控制的仍然只有一套uid和gid。也就是说,我们在容器中作为新创建的docker用户(uid 1000)执行进程,宿主机会认为该进程是宿主机上一个uid为1000的用户执行的,而这个用户不一定是我们的账号,相当于我们一个用户用冒名顶替者代替了别人,很难追查到真实用户。

为了解决这个问题,可以在添加用户时指定uid为用户的uid,比如1002;

RUN addgroup --gid 1002 docker && \
    adduser --uid 1002 --ingroup docker --home /home/docker --shell /bin/sh  --gecos "" docker

更好的解决方案是在容器启动时使用fixuid切换uid:


RUN useradd --create-home --no-log-init --shell /bin/bash user\
&& adduser user sudo \
&& echo 'user:password' | chpasswd


RUN USER=user && \
    GROUP=docker && \
    curl -SsL https://github.com/boxboat/fixuid/releases/download/v0.4.1/fixuid-0.4.1-linux-amd64.tar.gz | tar -C /usr/local/bin -xzf - && \
    chown root:root /usr/local/bin/fixuid && \
    chmod 4755 /usr/local/bin/fixuid && \
    mkdir -p /etc/fixuid && \
    printf "user: $USER\ngroup: $GROUP\n" > /etc/fixuid/config.yml

USER user:docker
ENTRYPOINT ["fixuid"]

此时需要在启动容器时指定uid和gid。命令如下:

docker run --rm -it -u $(id -u):$(id -g) image-name bash

【讨论】:

    猜你喜欢
    • 2019-01-19
    • 2015-09-25
    • 2018-01-20
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2019-07-18
    相关资源
    最近更新 更多