php - 如何从 dockerized php 应用程序记录到文件
问题描述
我有一个 php 应用程序 dockerized。我的问题是如何将 php 服务中的错误捕获到主机上的专用文件中。docker 文件看起来是下一个:
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "3000:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./public:/public
php:
build:
context: .
dockerfile: PHP.Dockerfile
environment:
APP_MODE: 'development'
env_file:
- 'dev.env'
volumes:
- ./app:/app
- ./public:/public
- ./php.conf:/usr/local/etc/php-fpm.d/zz-log.conf
mysql:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: <pass here>
env_file:
- 'dev.env'
volumes:
- mysqldata:/var/lib/mysql
- ./app:/app
ports:
- '3306:3306'
volumes:
mysqldata: {}
我在 php 服务内部php.conf
的映射/usr/local/etc/php-fpm.d/zz-log.conf
如下所示:
php_admin_value[error_log] = /app/php-error.log
php_admin_flag[log_errors] = on
catch_workers_output = yes
我的意图是使用 phperror_log()
函数并记录所有日志,php-error.log
其中的文件是 volume 中的一个文件app
。现在,来自容器的所有日志仅显示在终端上。
我已经为此苦苦挣扎了几个小时,不知道如何继续。谢谢
解决方案
我不知道你的源图像是什么。我假设一些 PHP 的官方 docker 镜像,例如https://hub.docker.com/_/php
所有容器化应用程序通常都配置为登录,stdout
因此您必须覆盖该行为。这真的是 PHP 特定的,我不是 PHP 专家。从您告诉我们的情况来看,您似乎知道如何覆盖该行为(通过使用某些error_log()
函数和php_admin_value[error_log] = /app/php-error.log
属性。
如果行为被覆盖,您应该确保文件app/php-error.log
存在于 PHP 容器内(即通过类似的方式进入容器内docker exec -it my-container-id /bin/bash
,然后执行ls /app/php-error.log
并cat /app/php-error.log
查看文件是否已创建。
因为您正在将./app
目录从主机安装到/app
容器中的目录,所以您已经将它们镜像了。无论容器内有什么,/app
您都可以在您的/path/to/docker/compose/app
目录中找到。您可以检查文件是否存在以及里面是否有一些内容。如果不是,您未能覆盖 PHP 登录到的默认行为。
推荐阅读
- python - 使用python拆分每小时报告
- c# - 如何使消息与 TcpClient 分开发送
- python - 如何在 Python 3 中访问类实例变量作为方法参数?
- php - 如何在 Google Cloud Platform 上使用 Firestore 正确部署 PHP 应用程序?
- sql - 查询中来自同一个表的两个 ID - 尝试获取两个 ID 的名称
- c++ - Matlab rescale 命令的特征等效项
- c# - 为什么httpcontent readasstringasync会抛出取消的异常
- angular - 在 Angular 中使用不同的样式和 js 布局分离管理、用户区域
- android - 智能转换为 (Int) 是不可能的,因为
是由变化的闭包捕获的局部变量 - r - 深度学习、神经网络