当前位置: 首页 > 知识库问答 >
问题:

在docker mysql容器中启用日志记录

越勇
2023-03-14

我试图熟悉docker生态系统,并尝试设置mysql数据库容器。使用docker compose这看起来像:

version: '2'
services:
  db:
    image: mysql:5.6.33@sha256:31ad2efd094a1336ef1f8efaf40b88a5019778e7d9b8a8579a4f95a6be88eaba
    volumes:
      - "./db/data:/var/lib/mysql"
      - "./db/log:/var/log/mysql"
      - "./db/conf:/etc/mysql/conf.d"
    restart: "yes"
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: db
      MYSQL_USER: db
      MYSQL_PASSWORD: dbpw

我的conf目录包含一个文件:

[mysqld]
log_error       =/var/log/mysql/mysql_error.log
general_log_file=/var/log/mysql/mysql.log
general_log     =1
slow_query_log  =1
slow_query_log_file=/var/log/mysql/mysql_slow.log
long_query_time =2
log_queries_not_using_indexes = 1

不幸的是,我没有这样得到任何日志文件。设置本身是正确的,并且使用了cnf文件。连接到容器并创建3个文件后,chown将它们添加到mysql并重新启动容器,日志记录按预期工作。

我很确定这是一个常见的场景,我目前让它运行的方法看起来真的很愚蠢。正确的做法是什么?

我可以通过在Dockerfile中移动所有这些东西来改进我的方法,但这对我来说仍然很奇怪。

共有2个答案

敖子安
2023-03-14

在连接到容器并创建3个文件后,将它们切换到mysql并重新启动容器,日志记录按预期工作。

这表明存在主机卷权限问题。当您从容器映射到主机时,不会对用户id进行映射,并且附加到容器内部uid的名称可能与外部uid的名称非常不同。您需要使用容器用户可以写入的内容初始化目录权限。一个简单的方法是创建一个组,该组有权写入主机和容器上的文件,然后将各种用户添加到映像和主机操作系统上的该组中。另一种选择是使用一个命名文件系统,您不能直接从主机访问该文件系统,并使用映像的目录权限对其进行初始化。

编辑:带有docker-compose.yml的命名卷的示例如下所示:

version: '2'
volumes:
  mysql-data:
    driver: local
  mysql-log:
    driver: local
  mysql-conf:
    driver: local

services:
  db:
    image: mysql:5.6.33
    volumes:
      - "mysql-data:/var/lib/mysql"
      - "mysql-log:/var/log/mysql"
      - "mysql-conf:/etc/mysql/conf.d"
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: db
      MYSQL_USER: db
      MYSQL_PASSWORD: dbpw

请注意,我还从您的图像名称中删除了sha256,此引用将阻止您提取图像的修补版本。我也更喜欢“除非停止”重启策略,这样Docker就可以在重启时预期事情。

杨宏儒
2023-03-14

我在寻找完全一样的东西,现在,有一个更好的方法来做这件事。

docker mysql写道:

许多配置选项可以作为标志传递给mysqld。这将使您能够灵活地自定义容器,而不需要cnf文件。例如,如果要将所有表的默认编码和排序规则更改为使用UTF-8(utf8mb4),只需运行以下命令:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

在docker-comment世界中,可以通过服务的“命令”部分传递这些参数:

command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

在我的用例中,我只想打开日志并指定日志文件的路径:

 command: mysqld --general-log=1 --general-log-file=/var/log/mysql/general-log.log

有了足够的卷(例如-./logs/mysql.log:/var/log/mysql/general log.log),访问它们变得很容易。

这非常简单,避免处理本地配置。它将与任何MySQL Docker映像一起工作,并将保留映像附带的my.cnf

 类似资料:
  • 问题内容: 我有一个使用Docker compose启动的Web应用程序,我想禁用所有日志记录(或者至少将其打印到syslog而不是文件中)。 当我的Web应用程序运行时,它可以在启动时快速生成一个11GB的日志文件,因此这会非常快地耗尽我的磁盘空间。 我知道普通docker 的run命令都有日志选项,但是在Docker Compose中,我使用 Docker组成 在应用程序文件夹中启动我的应用程

  • 问题内容: 我在Spring 3.5容器中将JpaTransactionManager与hibernate3一起使用。我无法为JPA启用日志记录。我希望看到用于调试我的某些服务的事务管理日志。我正在使用log4j。 这是我的log4j.properties中的内容 问题答案: 在启用JPATransactionManager的日志记录方面,这对我有用:1.下载logback jar(logback

  • 从docker容器中将结构化日志写入journald的最佳方式是什么? 例如,我有一个使用sd_journal_send而不是更改应用程序的应用程序,我尝试通过 -v/var/log/systemd/journal:/var/log/systemd/journal docker journald输出日志记录选项有哪些限制?它似乎不支持应用程序编写不仅仅是消息字段。 -- 所以我发现我需要 C程序可

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 我正在为日志创建一个Spring Bootjar。我在我的主要spring boot项目中添加了这个依赖项。我可以在主项目的控制台中获取日志。但是没有登录到文件中。 我在文件中添加了以下application.yml 谁能帮我一下吗。提前谢谢!

  • 我想调试ffmpeg。我添加以下代码来打印日志: 或 但它不能工作。没有任何调试信息。 然后启用调试生成选项: 它不能工作。 我确信我添加跟踪的地方会被执行。 我只想打印一些简单的信息,怎么做?