2016-09-26 32 views
3

我在尝试熟悉docker生态系统并试图设置mysql数据库容器。随着docker-compose这个样子:在docker mysql容器中启用日志记录

version: '2' 
services: 
    db: 
    image: mysql:[email protected]: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中移动所有这些东西来改进我的方法,但这对我来说仍然很奇怪。

回答

4

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

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


编辑:您的码头工人,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在重启时确实预计到这些事情。

+0

名称卷的文档似乎部分过时和不完整。这些数据存储在哪里?我是对的吗,我仍然需要知道mysql容器的uid和gid,才能使用此权限启动卷? – mheinzerling

+0

命名卷存储在内部Docker文件夹(通常为/ var/lib/docker)中。如果您尝试在那里访问它们,则会创建与主卷相同的问题。相反,你只能通过Docker容器访问它们。您可以将相同的卷安装在多个容器中,以便您可以使用容器来执行更新和备份等操作。 – BMitch

+0

我会陪着我的沙,以确保我测试和部署相同的版本,但'除非停止'是一个很好的提示。 – mheinzerling