【问题标题】:Extracting log files inside Docker container as non-root以非 root 身份提取 Docker 容器内的日志文件
【发布时间】:2017-08-30 06:55:56
【问题描述】:

我玩 dockers 已经有一段时间了,我在提取容器中运行的服务的日志文件目录时遇到了问题。

我的 Dockerfile 看起来像这样:

ENV HOME=/software/service
ENV LOGS=$HOME/logs
COPY Service.jar $HOME/Service.jar
WORKDIR HOME
CMD java -jar Service.jar

我为此创建了一个存根服务,他所做的只是在 LOGS 环境变量中创建日志文件名称 log.log 并每 2 秒写入一次。

我想要实现的是在我的 docker linux 主机中备份 log.log 文件。在阅读了多个选项后,我发现了 2 个流行的持久数据解决方案:

  1. 使用带有 docker run -v 选项的卷
  2. 创建保存数据的数据容器

选项 2 在这里没有多大帮助,因为我想查看我的 linux 主机中的日志,所以我选择了选项 1。

选项 1 的问题是它使用 root 权限创建日志,这意味着我必须登录到 root 才能删除这些日志,这可能会导致问题,当不是每个人都应该拥有 root 用户并删除日志是经常发生的事情。

因此,我阅读了更多内容,并找到了许多解决此问题的“解决方法”,其中一个是将我的 /etc/group/etc/passwd 文件安装在 docker 中并使用 -u 选项,其他类似。

我的主要问题是,是否有任何方便和标准的解决方案来解决这个问题,提取带有/不带有 -v 选项的日志文件,同时让整个组权限对 rwx 它。

谢谢!

【问题讨论】:

    标签: docker


    【解决方案1】:

    由于您希望日志位于您的主机中,您需要某种卷共享,而“-v”标志绝对是您可以做的最简单的事情。

    根据权限问题,我看到两个选项:

    1. 您提到的带有密码/组绑定挂载的-u 标志
    2. 将所需的用户名和组 ID 作为环境变量传递,并使在 docker 机器中运行的守护程序在创建时 chown 文件(当然这并不总是可行的)。

    我认为选项 1 虽然很棘手,但最容易应用。

    【讨论】:

    • 当我尝试选项 1 时,我在尝试创建日志目录时在容器中显示权限被拒绝,使用命令:docker run -ti \ -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro \ -u $( id -u $USER ):$( id -g $USER ) \ my-image:lastest 也许我错过了什么?
    • 这个日志目录是什么?当然,如果您使用非特权用户运行容器,则必须检查权限。例如,尝试登录 /tmp
    • 日志目录是在/software/service/logs下Dockerfile指定的,但是为什么我不能创建呢?
    • 在linux系统中,只要不是root,一般是不能在/下写的。例如,您可以在 dockerfile 中添加RUN mkdir -p /software/service/logs && chmod 777 /software/service/logs,或者在用户的主目录中选择一个目录(默认情况下应该是可写的,不需要 chown)
    • 玩了一会儿之后,我仍然不明白为什么我的容器中的 /software/service/logs 是由 root 创建的(当我 docker exec ls -l /software/service/logs 时,因为 java -jar Service.jar 正在创建我的用户运行的那个文件夹
    【解决方案2】:

    另一种选择是简单地将日志复制到主机:

    docker cp <container-name>:/software/service/logs .
    

    【讨论】:

    • 这个选项不太适合,因为当容器崩溃时我可能会丢失日志
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多