将日志保存在 docker 卷中卷上所有用户的写权限

如何解决将日志保存在 docker 卷中卷上所有用户的写权限

我有一个带有 docker-compose.yml

的 yii 应用程序
version: '3'
services:
  web:
    image: nginx
    restart: always
    volumes:
      - ./docker/conf/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
    ports:
      - 80:80
    depends_on:
      - php
  php:
    image: yiisoftware/yii2-php:7.1-fpm
    restart: always
    volumes:
      - ./docker/conf/php/php.ini:/usr/local/etc/php/conf.d/php.ini
      - .:/var/www/html

一切都很好。然后添加了一些将日志保存到/var/www/html/data/logs的功能。

我做我的事情,连接到容器并查看

$ sudo docker container exec -it php_1 bash
root@16270e4c7275:/app# ls -la /var/www/html/data/logs
total 1
drwxrwxrwx 1 root root   0 Jan 12 02:03 . // write permissions to all users for /var/www/html/data/logs
drwxrwxrwx 1 root root   0 Dec 30 03:12 ..
-rwxrwxrwx 1 root root 104 Jan 12 02:03 12-01-2021.log // log is here

然后我想在容器关闭时保存日志。我应该用什么?

我尝试提高音量 docker-compose.yml

  php:
    image: yiisoftware/yii2-php:7.1-fpm
    restart: always
    volumes:
      - ./docker/conf/php/php.ini:/usr/local/etc/php/conf.d/php.ini
      - .:/var/www/html
      - useractionlogs:/var/www/html/data/logs
volumes:
    pgdata:
    useractionlogs:

但是保存日志失败:-( 在容器中我看到

$ sudo docker container exec -it php_1 bash
root@16270e4c7275:/app# ls -la /var/www/html/data/logs
total 1
drwxr-xr-x 1 root root   0 Jan 12 02:03 . // write permissions are not to all users for /var/www/html/data/logs
drwxrwxrwx 1 root root   0 Dec 30 03:12 ..

我可以在容器中做

root@f11ac585d3b3:/app# chmod go+rw /var/www/html/data/logs
root@f11ac585d3b3:/app# ls -la /var/www/html/data/logs
total 4
drwxrwxrwx 2 root root 4096 Jan 12 02:19 .
drwxrwxrwx 1 root root    0 Dec 30 03:12 ..

但我应该在重新创建音量之后这样做。

有什么想法可以正确保存日志吗?可能还有其他方法吗?

谢谢!

解决方法

据我所知,这必须通过基于 nginx 基础映像的自定义 dockerfile 完成,通过使用它,您可以将 /var/www/html 中的内容的所有权更改为组(例如 apache 使用www-data 用户和组)并更改文件权限。通过这种方式,您可以遵循不使用 root 作为组权限的安全传统,还可以克服每次都必须手动更改权限的事实。

,

存储日志的正确方法是将其发送到标准输出。 https://12factor.net/logs

将日志视为事件流

日志提供对正在运行的应用程序行为的可见性。在 基于服务器的环境,它们通常写入磁盘上的文件 (一个“日志文件”);但这只是一种输出格式。

日志是从以下位置收集的聚合的、按时间排序的事件流 所有正在运行的进程和支持服务的输出流。日志 原始形式通常是每行一个事件的文本格式 (尽管来自异常的回溯可能跨越多行)。日志有 没有固定的开始或结束,但只要应用程序持续运行 操作。

十二要素应用程序从不关心路由或存储 它的输出流。它不应该尝试写入或管理 日志文件。相反,每个正在运行的进程都会写入其事件流, 无缓冲,到标准输出。在本地开发期间,开发商将 在其终端的前台查看此流以观察 应用的行为。

在暂存或生产部署中,每个进程的流将是 由执行环境捕获,与所有 来自应用程序的其他流,并路由到一个或多个最终 查看和长期存档的目的地。这些档案 目的地对应用程序不可见或由应用程序配置,并且 而是完全由执行环境管理。 可以使用开源日志路由器(例如 Logplex 和 Fluentd) 为此目的。

https://serverfault.com/questions/599103/make-a-docker-application-write-to-stdout/634296#634296

nginx Dockerfile 中给出了一个惊人的配方:

将请求和错误日志转发到 docker 日志收集器

运行 ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log

简单地说,应用程序可以继续将其作为文件写入,但结果是 这些行将转到 stdout 和 stderr!

和其他

然后使用 https://docs.docker.com/config/containers/logging/

Where is a log file with logs from a container?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?