修复Docker中的World-writable MySql错误

weixin_38101791 2019-09-12 11:43:59
我正在使用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配置文件(而不是使用卷),因为我想在多个站点中使用这些图像,并且每个图像可能具有不同的配置.
...全文
342 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38108526 2019-09-12
  • 打赏
  • 举报
回复
在使用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主机中更新,但在上述情况下我们想要使用自定义配置文件它没有任何区别并解决了这个问题.

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧