ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

修复Docker中的World-writable MySql错误

2019-06-11 17:03:29  阅读:948  来源: 互联网

标签:docker mysql file-permissions docker-compose dockerfile


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

标签:docker,mysql,file-permissions,docker-compose,dockerfile
来源: https://codeday.me/bug/20190611/1219825.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有