Docker:使用 --volume 绑定安装的文件权限

2023-12-25

我遵循以下指南:https://denibertovic.com/posts/handling-permissions-with-docker-volumes/ https://denibertovic.com/posts/handling-permissions-with-docker-volumes/在我的容器中设置 --volume 绑定挂载,并在来宾容器中创建一个与我的主机用户具有相同 UID 的用户 - 理论是我的容器用户应该能够访问该挂载。它对我不起作用,我正在寻找一些下一步尝试的建议。

更多背景细节:

我的 Dockerfile 从 alpine 基础开始并添加了 python 开发包。它按照 denibertovic 的指导方针复制entrypoint.sh 脚本。然后它跳转到 entrpoint.sh 脚本。

FROM alpine

RUN apk update
RUN apk add bash
RUN apk add python3
RUN apk add python3-dev
RUN apk add su-exec

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x  /usr/local/bin/entrypoint.sh

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

entrpoint.sh 脚本将用户添加到容器,并将 UID 作为环境变量传入。

#!/bin/bash

# Add local user
# Either use the LOCAL_USER_ID if passed in at runtime or
# fallback

USER_ID=${LOCAL_USER_ID:-9001}

echo "Starting with UID : $USER_ID"
adduser -s /bin/bash -u $USER_ID -H -D user
export HOME=/home/user

su-exec user "$@"

容器构建没有问题。 然后我使用以下命令行运行它:

sudo docker run -it -e LOCAL_USER_ID=`id -u` -v `realpath ../..`:/ws django-runtime /bin/bash

您将看到我正在传递要映射到容器用户的 UID 的主机 UID,并且我要求将卷绑定挂载从我的本地工作目录到容器中的 /ws 挂载点。

从容器内的 bash shell 中,我可以看到 /ws 由与我自己的“id”匹配的“用户”UID 拥有。但是,当我去列出 /ws 的内容时,我收到一个 Permission Denied 错误,如下所示:

[dleclair@localhost runtime]$ sudo docker run -it -e LOCAL_USER_ID=`id -u` -v `realpath ../..`:/ws django-runtime /bin/bash
[sudo] password for dleclair:
Starting with UID : 1000
bash-5.0$ id
uid=1000(user) gid=1000(user) groups=1000(user)
bash-5.0$ ls -la .
total 0
drwxr-xr-x    1 root     root            27 Feb  8 09:15 .
drwxr-xr-x    1 root     root            27 Feb  8 09:15 ..
-rwxr-xr-x    1 root     root             0 Feb  8 09:15 .dockerenv
drwxr-xr-x    1 root     root            18 Feb  8 07:44 bin
drwxr-xr-x    5 root     root           360 Feb  8 09:15 dev
drwxr-xr-x    1 root     root            91 Feb  8 09:15 etc
drwxr-xr-x    2 root     root             6 Jan 16 21:52 home
drwxr-xr-x    1 root     root            17 Jan 16 21:52 lib
drwxr-xr-x    5 root     root            44 Jan 16 21:52 media
drwxr-xr-x    2 root     root             6 Jan 16 21:52 mnt
drwxr-xr-x    2 root     root             6 Jan 16 21:52 opt
dr-xr-xr-x  119 root     root             0 Feb  8 09:15 proc
drwx------    2 root     root             6 Jan 16 21:52 root
drwxr-xr-x    1 root     root            21 Feb  8 07:44 run
drwxr-xr-x    1 root     root            21 Feb  8 08:22 sbin
drwxr-xr-x    2 root     root             6 Jan 16 21:52 srv
dr-xr-xr-x   13 root     root             0 Feb  8 01:58 sys
drwxrwxrwt    2 root     root             6 Jan 16 21:52 tmp
drwxr-xr-x    1 root     root            19 Feb  8 07:44 usr
drwxr-xr-x    1 root     root            19 Jan 16 21:52 var
drwxrwxr-x    5 user     user           111 Feb  8 02:15 ws
bash-5.0$
bash-5.0$
bash-5.0$ cd /ws
bash-5.0$ ls -la
ls: can't open '.': Permission denied
total 0
bash-5.0$

感谢任何人可以提供的任何指示。谢谢!


经过更多搜索,我在这里找到了问题的答案:访问 Docker 中的主机目录的权限被拒绝 https://stackoverflow.com/questions/24288616/permission-denied-on-accessing-host-directory-in-docker和这里:http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/ http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/.

简而言之,问题在于卷安装的 SELinux 默认标签阻止了对已安装文件的访问。解决方案是在 -v 命令行参数中添加“:Z”尾部,以强制 docker 针对已安装的文件设置适当的标志以允许访问。

因此命令行变成:

sudo docker run -it -e LOCAL_USER_ID=`id -u` -v `realpath ../..`:/ws:Z django-runtime /bin/bash

工作起来就像一个魅力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker:使用 --volume 绑定安装的文件权限 的相关文章

随机推荐

  • 如何使用 PDFplumber 只提取 pdf 文件中没有表格的文本?

    我想使用 NLP 模块处理一些 pdf 文件 然后我想从所有现有表中清除这些文件 这是使用 pdfplumber 提取表格的代码 import pdfplumber pdf pdfplumber open file pdf page pdf
  • Ltac:通过回溯重复策略 n 次

    假设我有一个像这样的策略 取自 HaysTac 它搜索一个参数来专门化一个特定的假设 Ltac find specialize in H multimatch goal with v gt specialize H v end 然而 我想写
  • 预期异常断言

    我需要为下一个函数编写一个单元测试 我看到我可以使用 ExpectedException 这是要测试的功能 public static T FailIfEnumIsNotDefined
  • 升级到 Rails 3.2.11 后 Capistrano 部署失败

    我有生产 Rails 3 2 3 应用程序 我用它来使用 capistrano 进行部署 当我决定将 Rails 升级到 3 2 11 时 我执行了以下步骤 更改 Gemfile 中的 Rails 版本 运行 捆绑更新轨道 从供应商 缓存
  • 实体框架 IsRowVersion() 没有并发检查

    我们有一个表 其中有一列名为Version映射为 SQLrowversion 这样做是因为我们有一个映射到我们数据的外部系统 该系统依赖于每次表更新时都会更改的该列 最初我们希望通过 SQL 来处理此问题 但现在我们发现存在乐观并发异常 虽
  • Android Studio 的 VSCode 键盘快捷键

    有没有办法在 Android Studio 的键盘映射设置下添加 VSCode 作为选项 Under File gt Settings gt Keymap 列出了许多其他选项 但它们都与 VSCode 相似 事实上 JetBrains 已经
  • Alembic 检测到已经存在的表,因此它尝试再次创建它们

    我的动态表模型如下 在数据库中没有测试列 我想用 alembic 更新它 class Animation Base tablename Animation id Column Integer primary key True index T
  • SQLi 并检索特定记录

    环顾四周 看到了很多 MySQL 答案 但没有看到 MySQLi 我正在尝试返回我选择的 1 行 目前我只能返回第一行 我想要实现的是 让我的主数据库通过 ID 链接 当您单击 ID 时 可以在另一页上仔细查看记录
  • Python:列表中的非重复随机值[重复]

    这个问题在这里已经有答案了 我正在尝试用 python 2 7 编写一个程序 该程序必须选择多个随机变量并将其打印出来 但该变量不能与之前打印出的任何变量相同 我一直在浏览谷歌和这个网站 但我还没有找到任何关于字符串的东西 到目前为止我只找
  • 如何在 MVC 中进行 foreach 循环来为项目设置新值。

    我试图在类中循环抛出对象并检查其数据类型 并进行控制 如果数据类型是字符串 那么我希望此项值为空 如果数据类型为 int 则此项的值为 0 依此类推 这是我的伪代码 ProductionOrderItem i new ProductionO
  • 使用ggplot2在地图上绘制条形图

    我必须使用在地图上绘制条形图ggplot2 library ggplot2 q ggplot data mapindia aes long lat group group colour geom polygon fill FF9999 co
  • java:稀疏位向量[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 中有哪些著名的稀疏位向量库吗 是否有关于稀疏与稀疏使用它们的有用程度的指南 java uti
  • 用于平面到嵌套/分层的 XSLT,具有级别插值?

    给定这个源 XML 文档 输入 xml p content p p content p p content p p content p p content p p content p p content p p content p p co
  • 在 swift 中实现文档选择器 (iOS)

    我想在我的 iOS 应用程序中选择任何类型的文件 pdf docs xlsx jpeg txt rtf 等 功能 点击时Upload按钮 我希望我的应用程序打开一个目录并选择文件 DocumentsPicker IBAction pickD
  • 使用 python 处理 excel 时出错

    当我的脚本同时更新一个 Excel 时 如果我要手动执行任何其他工作 而另一个 Excel 会发生错误 我正在使用调度 from win32com client import Dispatch excel Dispatch Excel Ap
  • Angular:Nodemailer 显示大量运行时错误

    在我的角度项目中 我想使用节点邮件程序发送邮件 第一个问题是当我尝试导入时 我的意思是在执行 npm i save 之后 当我这样做时会发生很多错误ionic serve 我想重复一件事 写完之后import行 这个大错误日志来了 应用程序
  • System.IO.File.Delete() / System.IO.File.Move() 有时不起作用

    Winforms 程序需要将一些运行时信息保存到 XML 文件中 该文件有时可能有几百千字节大小 在 Beta 测试期间 我们发现一些用户会毫不犹豫地看似随机地终止进程 有时会导致文件写入一半并因此损坏 因此 我们更改了算法以保存到临时文件
  • 语音搜索权限

    Running 谷歌语音搜索 https play google com store apps details id com google android voicesearch在我的 ICS Android 4 0 4 平板电脑上出现奇怪
  • 用于为 Java 应用程序构建交互式 shell 的库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找可以让我创建交互式 shell 的 Java 库 我已经做了一些搜索 但还没有找到很多 我发现的大部分内容都是用于向我的应用程序
  • Docker:使用 --volume 绑定安装的文件权限

    我遵循以下指南 https denibertovic com posts handling permissions with docker volumes https denibertovic com posts handling perm