Docker 无法写入使用 -v 挂载的目录,除非它有 777 权限

2024-04-27

我正在使用docker-solr https://github.com/makuk66/docker-solr使用 docker 生成图像,我需要在其中安装一个目录,这是我使用-v flag.

问题是容器需要写入我已安装到其中的目录,但似乎没有权限这样做,除非我这样做chmod 777在整个目录上。我不认为设置权限以允许所有用户读取和写入它是解决方案,而只是一个临时的解决方法。

谁能指导我找到更规范的解决方案?

编辑:我一直在运行 docker 没有sudo因为我将自己添加到了 docker 组中。我刚刚发现如果我运行 docker 问题就解决了sudo,但我很好奇是否还有其他解决方案。


最近,在浏览了一些官方的 docker 存储库后,我意识到解决这些权限问题的更惯用的方法是使用名为gosu https://github.com/tianon/gosu与入口点脚本配合使用。例如,如果我们采用现有的 docker 项目(例如 solr),这与我之前遇到问题的项目相同。

The docker文件 https://github.com/makuk66/docker-solr/blob/master/5.3/DockerfileGithub 上的 非常有效地构建了整个项目,但没有解决权限问题。

因此,为了克服这个问题,首先我将 gosu 设置添加到 dockerfile 中(如果您实现此功能,请注意版本1.4是硬编码的。您可以检查最新版本here https://github.com/tianon/gosu/releases).

# grab gosu for easy step-down from root
RUN mkdir -p /home/solr \
    && gpg --keyserver pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
    && curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture)" \
    && curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture).asc" \
    && gpg --verify /usr/local/bin/gosu.asc \
    && rm /usr/local/bin/gosu.asc \
    && chmod +x /usr/local/bin/gosu

现在我们可以使用gosu,它基本上与su or sudo,但与 docker 配合使用效果更好。从 gosu 的描述来看:

这是一个简单的工具,源于这样一个简单的事实:su 和 sudo 具有非常奇怪且经常令人讨厌的 TTY 和信号转发行为。

现在我对 dockerfile 所做的其他更改是添加这些行:

COPY solr_entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh
ENTRYPOINT ["/sbin/entrypoint.sh"]

只是为了将我的入口点文件添加到 docker 容器中。

并删除该行:

USER $SOLR_USER

所以默认情况下你是root用户。 (这就是为什么我们有 gosu 从 root 降级的原因)。

现在至于我自己的入口点文件,我认为它写得并不完美,但它完成了工作。

#!/bin/bash

set -e

export PS1="\w:\u docker-solr-> "

# step down from root when just running the default start command
case "$1" in
    start)
        chown -R solr /opt/solr/server/solr
        exec gosu solr /opt/solr/bin/solr -f
    ;;
    *)
        exec $@
    ;;
esac

docker run 命令采用以下形式:

docker run <flags> <image-name> <passed in arguments>

基本上入口点说如果我想像往常一样运行 solr 我们传递参数start到命令末尾,如下所示:

docker run <flags> <image-name> start

否则运行您以 root 身份传递的命令。

The start option first授予 solr 用户目录所有权,然后运行默认命令。这解决了所有权问题,因为与一次性的 dockerfile 设置不同,入口点每次都会运行。

所以现在如果我使用 -d 标志挂载目录,在入口点实际运行 solr 之前,它将 chown 这些文件inside为您提供 docker 容器。

至于这对容器外的文件有何影响,我得到了不同的结果,因为 docker 在 OSX 上的行为有点奇怪。对我来说,它没有更改容器外部的文件,但在另一个操作系统上,docker 与文件系统的配合更好,它可能会更改外部的文件,但我想如果您愿意的话,这就是您必须处理的将文件挂载到容器内,而不是仅仅将它们复制进去。

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

Docker 无法写入使用 -v 挂载的目录,除非它有 777 权限 的相关文章

  • 从 Dockerfile 写入 docker 卷不起作用

    请考虑以下 Dockerfile FROM phusion baseimage VOLUME data RUN touch data HELLO RUN ls ls data 问题 data 目录不包含 HELLO 文件 此外 任何其他写入
  • 使用请求和多处理时的奇怪问题

    请检查这个Python代码 usr bin env python import requests import multiprocessing from time import sleep time from requests import
  • lua中的权限问题

    是否需要在 corona build settings 中设置一些特定权限才能将高分永久保存在文件中 每次运行代码时都会出现 权限被拒绝 的错误 如何纠正这个错误 这是我尝试过的代码 function read score local f1
  • 使用多线程的套接字服务器或文件服务器实现:概念不清楚

    请帮我理清这个概念 假设我们有一个使用线程实现的套接字端口服务器 套接字服务器侦听套接字端口 并在消息到达时创建一个线程来服务该请求 客户端代码向服务器发送给定数量的消息 该客户端代码也可以由多个用户在不同的计算机上运行 我知道客户端代码作
  • 如何重命名共享库以避免同名冲突?

    我找到了一个图书馆 libjson http sourceforge net projects libjson 我正在尝试将其构建为共享库并在项目中使用 建造很简单 修复 Makefile 错误后 SHARED 1 make install
  • 使用 Fig 时,为什么我的卷有时无法安装到 Docker 容器中?

    我在 Docker Fig 环境中看到一个奇怪的问题 我的假设是 这是由于将卷安装到容器的延迟造成的 但我不确定如何确认这一点 我有一个包含以下内容的容器 Dockerfile FROM busybox MAINTAINER Dan Rum
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • 在命令行上解密使用 PHP openssl_encrypt 制作的文件

    我有一个要加密的字符串 encryptThis Super Secret Text echo openssl encrypt encryptThis aes 128 cbc 1234 FALSE F68A9A229A516752 然后我通过
  • nginx docker 容器:502 错误网关响应

    我有一个服务监听 8080 端口 这不是一个容器 然后 我使用官方镜像创建了一个 nginx 容器 docker run name nginx d v root nginx conf etc nginx conf d p 443 443 p
  • Django检查用户组权限

    我有一个名称 的自定义权限可以显示分发页面 代号 can show distribute page 内容类型 User 我添加两个组 名为 manager and normal 一个拥有所引用的许可 一个没有 如何判断用户是否有该权限 我尝
  • 将一个文件写入.c中的另一个文件

    我有一个读取文件然后将其内容复制到另一个文件的代码 我需要使其仅复制每 20 个符号 然后跳过 10 个符号 然后再次跳过 20 个符号 依此类推 我必须使用 lseek 函数 但我不知道如何将所有这些放入循环中来执行此操作 main ar
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 使用 Github 注册表中的 Docker 镜像未经授权

    我在本地创建了 Docker 镜像 将其标记为 Github Docker 注册表 将其推送到 Github Docker 注册表 现在我想在 Github 操作中使用它来创建 Docker 镜像FROM字段但它总是失败unauthoriz
  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • 运行命令后存在来自 rocker/r-ver:4.0.4 的容器

    这是我的 Dockerfile FROM rocker r ver 4 0 4 在 cmd 中我构建 docker build t myfolder myimage 它塑造的形象很好 然后我跑 docker run myfolder myi
  • 使用 shell 脚本在 docker 容器内运行脚本

    我正在尝试创建一个 shell 脚本来设置 docker 容器 我的脚本文件如下所示 bin bash docker run t i p 5902 5902 name mycontainer privileged myImage new b
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 在 Docker Compose 中更改 postgres 容器服务器端口

    我正在尝试使用 Docker compose 在远程服务器上部署第二个数据库容器 该 postgresql 服务器在端口 5433 上运行 而不是第一个 postgresql 容器使用的端口 5432 当我设置应用程序时 我收到以下错误输出
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些

随机推荐