如何解决将日志保存在 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!
和其他