Warm tip: This article is reproduced from serverfault.com, please click

其他-在Docker中修复World-Writable MySql错误

(其他 - Fixing World-writable MySql error in Docker)

发布于 2016-05-03 10:07:58

我正在使用docker-compose,对于db,我已经定义了这样的容器:

db:
  build: ../builds/mysql-5.7
  environment:
     - MYSQL_ROOT_PASSWORD=pass
     - MYSQL_DATABASE=
     - MYSQL_USER=
     - MYSQL_PASSWORD=
  expose:
     - 3306
  volumes:
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/data/:/var/lib/mysql/
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/conf.d/:/etc/mysql/conf.d/
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/log/:/var/log/mysql/

我对此镜像的Dockerfile是:

# Base image
FROM mysql:5.7

# Set valid file permissions - otherwise MySql won't read those files

#COPY mysql-perm-fix.sh /etc/init.d/mysql-perm-fix.sh
#RUN chmod +x /etc/init.d/mysql-perm-fix.sh
#RUN update-rc.d mysql-perm-fix.sh defaults 100

#RUN mkdir /etc/mysql/conf.d/source
#RUN cp /etc/mysql/conf.d/source/my.cnf /etc/mysql/conf.d/my.cnf
#RUN chmod -R 644 /etc/mysql/conf.d

目前,除基本MySql映像外,所有内容均已注释。

问题是,当我启动容器时,由于以下警告,MySql不会使用MySql cnf文件:

mysqld:[警告]世界可写的配置文件'/etc/mysql/conf.d/my.cnf'被忽略。

我使用Windows作为主机系统。问题在于Docker会以完全许可权挂载目录,并且无法更改它们。

问题-如何解决?如你在Dockerfile中看到的,我已经尝试了一些解决方案,但是它们都不对我有用(但是也许我做错了什么)。

目前,我认为最合理的解决方案是将MySql conf文件不直接安装/etc/mysql/conf.d/到其他目录中,而是直接安装到其他目录中,/etc/mysql/conf.d/然后在MySql启动之前将这些文件复制到目录中,并设置为非777权限。我已经尝试过了,但是在Dockerfile中,这些文件尚不存在,因此无法复制。

有没有简单的解决方案可以解决?或者也许可以更改某些MySql设置以不关心conf文件的权限?

我也不能简单地在Dockerfile中使用COPY复制Mysql配置文件(而不是使用卷),因为我想通过多个站点使用这些映像,并且每个映像可能具有不同的配置。

Questioner
Marcin Nabiałek
Viewed
11
Marcin Nabiałek 2016-05-07 21:52:16

似乎使用Windows主机时具有不完全权限的文件的解决方案是与“中间目录”共享文件,然后将这些文件复制到Docker容器中的所需目录中。

在上述情况下(MySQL容器),可以这样完成(在其他情况下也可以使用此方法)

Dockerfile的

# Base image
FROM mysql:5.7

# Copy starting scripts file
COPY start.sh /root/start.sh

# Run necessary services
CMD ["/bin/bash", "/root/start.sh"]

docker-compose.yml(仅显示数据库容器)

db:
  build: ../builds/mysql-5.7
  environment:
     - MYSQL_ROOT_PASSWORD=pass
     - MYSQL_DATABASE=
     - MYSQL_USER=
     - MYSQL_PASSWORD=
  expose:
     - 3306
  volumes:
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/data/:/var/lib/mysql/
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/conf.d/:/etc/mysql/conf.d/source
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/log/:/var/log/mysql/

请注意,上面我们将conf.d目录安装到/etc/mysql/conf.d/source目录而不是/etc/mysql/conf.d/目录(因此MySql现在不会加载该文件)。

start.sh

#!/bin/sh

cp /etc/mysql/conf.d/source/* /etc/mysql/conf.d/

/entrypoint.sh mysqld

在上面,我们现在将所有文件conf.d/source直接复制conf.d-这些文件不与Windows主机共享,因此将使用Linux权限创建它们(在我的情况下,保留默认值-无需使用chmod即可)。

要验证是否现在已加载自定义mysql配置值,请运行:

mysql -u root -p

并输入我的密码。

当我键入内容时,SHOW VARIABLES;我会看到my.cnf以前的一些设置(不放该文件具有不同的值),因此它可以按预期工作。

当然,该解决方案的缺点是这些文件不会真正共享,因此如果这些文件在Docker计算机中进行更改,则不会在Windows主机中进行更新,但是在上述情况下,当我们要使用自定义配置文件时它并没有任何作用,也不会解决问题。