作为非root用户在Docker容器内提取日志文件

4

我一直在尝试使用Docker,最近我遇到了一个问题:无法提取容器内服务的日志文件目录。

我的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权限。
谢谢!
2个回答

0

由于您希望日志在主机中,因此需要一些卷共享的方式,并且“-v”标志绝对是您可以执行的最简单的操作。

至于权限问题,我看到了两个选项:

  1. 使用密码/组绑定的-u标志
  2. 将所需的用户名和组ID作为环境变量传递,并使在docker机器中运行的守护进程在创建文件时拥有该文件(但当然,这并非始终可行)。

我认为选项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也许我漏掉了什么? - user6209005
这个日志目录是什么?当然,如果您使用非特权用户运行容器,则必须检查权限。例如,尝试在 /tmp 中记录日志。 - whites11
日志目录在 Dockerfile 中指定为 /software/service/logs,但是为什么我不能创建它呢? - user6209005
在Linux系统中,通常情况下,只有root用户才能在/目录下进行写操作。例如,在Dockerfile中添加RUN mkdir -p /software/service/logs && chmod 777 /software/service/logs,或者选择用户主目录内的一个目录(默认情况下应该是可写的,无需chown)来进行写操作。 - whites11
在使用一段时间后,我仍然不明白为什么我的容器内的/software/service/logs是由root创建的(当我执行docker exec ls -l /software/service/logs时),因为java -jar Service.jar正在创建该文件夹,而该命令是由我的用户运行的。 - user6209005

-1
另一个选项是将日志简单地复制到主机上:
docker cp <container-name>:/software/service/logs .

这个选项不太适合,因为当容器崩溃时,我可能会丢失日志。 - user6209005

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接