我有一个容器,它创建了一个默认用户,其 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?
容器和主机之间的 UID 动态映射已被请求,但我相信它需要内核和文件系统更改才能实现。在那之前,您有几个选择:
使主机与容器相匹配。对于主机卷,这并不容易。但对于命名卷,docker 会将卷初始化为镜像的内容,包括目录和文件权限,使其变得相当无缝。您需要调整工作流程,不再直接访问卷中的数据,而是使用容器来访问数据。
作为主机 uid 运行容器。您可以将 /etc/passwd 作为主机卷挂载到容器中,并且可以以任何 uid(使用compose 文件中的条目)docker run -u启动容器。user唯一的缺点是映像中的文件可能已归用于构建映像的 uid 所有,因此它们要么需要全局可读(可能可写),要么移动到卷中。
据了解,我以 root 身份启动容器,并使用一个入口点来根据卷挂载的文件权限纠正 uid/gid 不匹配。然后,我的入口点的最后一步是删除新 uid 的权限并执行容器应用程序。有关执行此操作的入口点的示例,请参阅我的docker示例中的 jenkins,该示例将 jenkins gid 与从主机安装的 docker 套接字的 gid 相匹配。
| 归档时间: |
|
| 查看次数: |
2810 次 |
| 最近记录: |