无法在 Docker Compose 中向非 root 用户授予对 Docker 卷的写入权限

2024-02-03

我正在运行一个 Docker Compose 环境,在其中执行一系列 Selenium 测试。为了做到这一点,我正在使用Selenium 提供的图像 https://github.com/SeleniumHQ/docker-selenium。我运行两个容器:一个作为硒集线器另一个作为硒火狐节点。我定义了第三个容器,负责测试执行(我们称之为测试节点).

我创建了一个 Docker 卷,供硒火狐节点测试节点因此某些文件可以由他们共享。我调了音量selenium_volume并且它安装在/selenium_tests.

我很快就遇到了一个问题,因为在两个系统中都为用户创建了该文件夹root,但用户硒火狐节点默认使用的是seluser。它具有我需要的读取权限,但没有写入权限。

我尝试使用以下内容作为容器entrypoint,所以我做seluser目录的所有者:bash -c 'sudo chown -R seluser:seluser /selenium_tests && /opt/bin/entry_point.sh',但它不起作用。

当我在容器启动后连接到容器时(docker exec -ti selenium-firefox bash),我看到该文件夹​​仍然属于root。如果我连接后运行命令sudo chown -R seluser:seluser /selenium_tests && /opt/bin/entry_point.sh',文件夹权限被更改,我们达到了我所期望的程度。

我想知道为什么它在我手动运行命令时有效,但在运行命令时却不起作用entrypoint在容器的入口点脚本之前。

目前我的docker-compose.yml看起来类似于以下内容:

    version: '3.8'
    
    services:
      tests-node:
        build: .
        depends_on:
         - selenium-hub
         - selenium-firefox
        # the wait-for-it.sh command makes the container wait until the Selenium containers are ready to work
        entrypoint: ["./wait-for-it.sh", "-t", "15", "selenium-firefox:5555", "--"]
        command: ["execute_tests.sh"]
        volumes:
          - ./remote_reports/:/selenium_tests/reports/
          - type: volume
            source: selenium_volume
            target: /selenium_tests
        networks:
          selenium_net: {}
    
      selenium-hub:
        image: selenium/hub:3.141.59
        ports:
          - "4444:4444"
        networks:
          selenium_net: {}
    
      selenium-firefox:
        image: selenium/node-firefox:3.141.59
        depends_on:
          - selenium-hub
        entrypoint: bash -c 'sudo chown -R seluser:seluser /selenium_tests && /opt/bin/entry_point.sh'
        volumes:
          - /dev/shm:/dev/shm
          - type: volume
            source: selenium_volume
            target: /selenium_tests
        environment:
          - HUB_HOST=selenium-hub
          - HUB_PORT=4444
        networks:
          selenium_net: {}
        expose:
          - 5555
    
    volumes:
      selenium_volume:
    
    networks:
      selenium_net:
        driver: bridge

我尝试运行 chown 命令command之后entrypoint但我认为它永远不会达到,因为在entrypoint继续在前台运行。

我想直接在 docker-compose.yml 上完成所有操作并避免创建任何 Dockerfile,但我不知道目前这是否可行。


我找到了一个可能的解决方案。使用它作为入口点:

bash -c '( while ! timeout 1 bash -c "echo > /dev/tcp/localhost/5555"; do sleep 1; done ; sudo chown -R seluser:seluser /selenium_tests ) & /opt/bin/entry_point.sh'

它运行之前的代码部分&在后台,允许entry_point.sh运行没有问题。当端口 5555 准备好后,它最终授予所需文件夹的权限seluser.

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

无法在 Docker Compose 中向非 root 用户授予对 Docker 卷的写入权限 的相关文章

随机推荐

  • 在Ruby中,如果我们定义了一个方法调用“c=”,为什么不能通过c = 3来调用它?

    例如 如果我们 def c foo p hello end c 3 c 3 并且不会打印 hello 我知道它可以被调用self c 3但为什么 还可以通过哪些其他方式调用它 c 3 and c 3 与它完全等效 始终被解释为局部变量赋值
  • 我无法初始化 NSInputStream

    请帮助我 我快疯了 我需要创建一个NSInputStream这样我就可以通过 wifi 从相机读取实时预览 liveViewStream 是一个NSInputStream 在我的实现中声明的实例变量 如下所示 implementation
  • undefined 不是一个对象(评估 'navigation.navigate')

    我正在尝试在本机反应中从一个屏幕导航到选项卡栏中的另一个屏幕 但是 我收到以下错误 ButtonClickCheckFunction gt const navigation this props navigation navigate de
  • 查明函数是否被调用

    我正在用Python编程 我想知道是否可以测试我的代码中是否调用了函数 def example pass example Pseudocode if example has been called print foo bar 我该怎么做 如
  • CastleWindsor 3.0 和 DefaultServiceHostFactory.RegisterContainer()?

    以下内容无法编译 DefaultServiceHostFactory RegisterContainer Container Kernel Castle 3 0 中似乎不存在静态方法 我检查了 Breakingchanges txt 但没有
  • 使用 Pandas 读取数据(.dat 文件)

    如何使用 Pandas 读取以下 两列 数据 来自 dat 文件 TIME XGSM 2004 006 01 00 01 37 600 1 2004 006 01 00 02 32 800 5 2004 006 01 00 03 28 00
  • 防止 dblclick 事件触发时触发 click 事件

    我正在处理 DOM 元素上的 click 和 dblclick 事件 每个执行不同的命令 但我发现当双击元素时 除了触发双击事件之外 还触发了两次单击事件 防止这种行为的最佳方法是什么 万一其他人偶然发现这个问题 就像我一样 寻找答案 我能
  • Angular 8 和 9 中提供和注入“Window”与 Window 之间有什么区别?

    我有两个使用这些版本的 Angular 项目 9 0 0 下一个 6 8 1 0 在版本 9 中我用它来提供和注入window目的 NgModule providers provide Window useValue window expo
  • 使用 Java 重命名文件

    我们可以重命名一个文件吗test txt to test1 txt If test1 txt存在会重命名吗 如何将其重命名为已经存在的 test1 txt 文件 以便将 test txt 的新内容添加到其中以供以后使用 复制自http ex
  • 从 ELF 目标文件转储 C 结构大小

    如何使用调试符号从 ELF 目标文件中提取所有 C 结构的大小 可以使用 print sizeof some struct 从 GDB 获取各个结构大小 但我需要的是获取所有结构的列表 我查看了 nm 和 objdump 但没有看到执行我正
  • MongoDB“无法找到 $geoNear 查询的索引”

    我只是想得到一个简单的near查询工作 这是我的文档的示例 point type Point coordinates 30 443902444762696 84 27326978424058 created on date 13980167
  • 在 R Markdown 模板中包含图像,无需为模板创建新目录

    我正在构建一个投影仪演示模板 我想在幻灯片的前面添加一个徽标 尽管这可以通过在演示文稿目录中包含图像来实现 但我不希望只为该图像的每个新演示文稿创建一个新目录 有没有一种方法可以从包内检索相对文件路径resources文件夹并让它引用 La
  • 为什么套接字可以 connect() 到它自己的临时端口?

    我可以可靠地获得 Winsock 套接字connect 如果我使用自动分配的临时端口 5000 65534 范围内的端口连接到本地主机 具体来说 Windows 似乎有一个系统范围的滚动端口号 这是它将尝试分配为客户端套接字的本地端口号的下
  • 使用 std::string 键提升共享内存中的无序映射

    是否可以在共享内存上使用 std string 或其他复杂结构键类型以及 boost 无序映射 如果是这样 我可以找到一些示例代码吗 我找到了一些在共享内存上使用无序映射的示例代码 但无法将键类型更改为复杂结构 谢谢 Yes 您可以在此处查
  • 如何向初学者描述面向对象编程?现实世界有一个很好的类比吗?

    我的姐夫是一名大学工程专业的新生 他之前没有编程经验 他正在课堂上学习编程 但他似乎在基本概念上遇到了困难 更糟糕的是 他似乎是所有班级中唯一没有编程背景的人 他在 Matlab 上做得很好 我不知道 然后当他学习 Python 基础知识时
  • Cytsocape.js 无法使用不存在的目标创建边缘

    在使用 AJAX 请求创建节点后 我尝试创建边缘 My code success function data each data kids function i value cy add group nodes data id value
  • 从 QML 访问 QStandardItemModel 的项目

    已编辑 在原始问题中 我错误地假设 GridView 本机使用二维模型 事实上 它与其他 QML 类似 需要一个元素列表 意见 为了使问题和答案更容易理解 我更改了给定的代码 轻微地 此外 我根据答案添加了工作解决方案 在主程序中 我定义了
  • Win32 LB_GETTEXT 返回垃圾

    我有一个问题 很可能是一个简单的问题 但对我来说仍然是一个问题 我在 Win32 C 中使用列表框 当从列表框中获取选定的文本时 返回的字符串只是垃圾 它是结构或类似结构的句柄 下面是代码和我得到的示例 std string Listbox
  • 在heroku上管理多个ssh密钥

    所以我有几个 ssh 密钥用于我拥有的其他帐户 我现在需要能够在我的计算机上克隆 heroku 存储库 我创建了一个新的 ssh 密钥并使用 heroku keys add 将其添加到我的 heroku 帐户 但是 当我尝试克隆存储库时 我
  • 无法在 Docker Compose 中向非 root 用户授予对 Docker 卷的写入权限

    我正在运行一个 Docker Compose 环境 在其中执行一系列 Selenium 测试 为了做到这一点 我正在使用Selenium 提供的图像 https github com SeleniumHQ docker selenium 我