有没有办法在运行时重新映射用户 ID?

Naf*_*Kay 6 docker

我有一个容器,它创建了一个默认用户,其 UID 为 1000。

在我的 Dockerfile 中,我正在创建用户:

RUN groupadd sudo && useradd -G sudo -u 1000 -U ${RUST_USER}
Run Code Online (Sandbox Code Playgroud)

现在,当我运行容器时,除非我当前用户的 UID 正好为 1000,否则卷权限会混乱:

docker run -it --rm naftulikay/circleci-lambda-rust:latest \
    -v $PWD:/home/circleci/project \
    .local/bin/build
Run Code Online (Sandbox Code Playgroud)

在运行时:

error: failed to write /home/circleci/project/Cargo.lock

Caused by:
  failed to open: /home/circleci/project/Cargo.lock

Caused by:
  Permission denied (os error 13)
Exited with code 101
Run Code Online (Sandbox Code Playgroud)

这是因为容器内的用户的 UID 为 1000,容器外的用户的 UID 为 1001。

我想,由于这已经是内核命名空间的所有虚拟映射,因此可以将内部 UID 映射到容器中的外部 UID。

是否有命令行选项允许我根据需要动态重新映射 UID?

BMi*_*tch 6

容器和主机之间的 UID 动态映射已被请求,但我相信它需要内核和文件系统更改才能实现。在那之前,您有几个选择:

  1. 使主机与容器相匹配。对于主机卷,这并不容易。但对于命名卷,docker 会将卷初始化为镜像的内容,包括目录和文件权限,使其变得相当无缝。您需要调整工作流程,不再直接访问卷中的数据,而是使用容器来访问数据。

  2. 作为主机 uid 运行容器。您可以将 /etc/passwd 作为主机卷挂载到容器中,并且可以以任何 uid(使用compose 文件中的条目)docker run -u启动容器。user唯一的缺点是映像中的文件可能已归用于构建映像的 uid 所有,因此它们要么需要全局可读(可能可写),要么移动到卷中。

  3. 据了解,我以 root 身份启动容器,并使用一个入口点来根据卷挂载的文件权限纠正 uid/gid 不匹配。然后,我的入口点的最后一步是删除新 uid 的权限并执行容器应用程序。有关执行此操作的入口点的示例,请参阅我的docker示例中的 jenkins,该示例将 jenkins gid 与从主机安装的 docker 套接字的 gid 相匹配。