运维开发网

修复Docker中的World-writable MySql错误

运维开发网 https://www.qedev.com 2020-07-07 18:37 出处:网络 作者:运维开发网整理
我正在使用docker-compose,对于db我有这样的容器定义: db: build: ../builds/mysql-5.7 environment: - MYSQL_ROOT_PASSWORD=pass - MYSQL_DATABASE= - MYSQL_USER= - MYSQL_PASSWORD= expose: - 330
我正在使用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: [Warning] World-writable config file ‘/etc/mysql/conf.d/my.cnf’ is ignored.

我使用Windows作为我的主机系统.问题是Docker以完全权限挂载diretory并且无法更改它们.

问题 – 如何解决?正如你在我的Dockerfile中看到的那样,我尝试了一些解决方案,但它们都不适用于我(但也许我做错了).

目前我认为最合理的解决方案是将MySql conf文件不是直接挂载到/etc/mysql/conf.d/,而是挂载到其他目录并在MySql启动之前将这些文件复制到/etc/mysql/conf.d/目录并设置它们不是777权限.我已经尝试过了,但在Dockerfile中,这些文件还没有出现,因此无法复制.

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

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

在使用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主机中更新,但在上述情况下我们想要使用自定义配置文件它没有任何区别并解决了这个问题.

0

精彩评论

暂无评论...
验证码 换一张
取 消