解决Docker部署mysql挂载宿主机配置文件不生效

本文讲述了作者在使用docker-compose部署Docker私有化应用时,遇到的配置文件编码问题,如何通过检查my.cnf文件的编码并解决,以确保MySQL配置生效的过程。

问题重现

最近在研究Docker私有化部署应用时,博主打算使用docker-compose方式部署mysql,nacos还有具体的应用,mysql目前使用自己定义的Dockerfile来构建镜像,使用docker-compose.yml来部署服务:

FROM mysql:5.7

ADD ./config/ /etc/mysql/

EXPOSE 3366

CMD ["mysqld"]


version: '3.7'
 
services:
  mysql-db:
    container_name: mysql5.7
    #image: mysql:5.7
    image: test-mysql:0.0.1
    build:
      context: ./mysql
      dockerfile: Dockerfile

    ports:
      - 3366:3366
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/log:/var/log/mysql
      - ./mysql/config:/etc/mysql
    command:
      --wait_timeout=31536000
      --interactive_timeout=31536000
      --max_connections=1000

但是在使用docker-compose up -d命令拉起服务时,发现数据目录可以挂载到本地,但是config目录下的配置文件my.cnf不生效:

[mysqld]
port=3366

问题分析

配置文件只配置了mysqld的端口,但是服务启动的时候还是使用了默认的3306端口,然后打算在docker-compose.yml里command加上指定的配置项--default-file=/etc/mysql/my.cnf,结果发现报错了:

Found option without preceding group in config file: /Users/gukey/.my.cnf at line: 1

 因此打算使用最原始的命令行的方式来运行容器:

docker run --name mysql5.7 -p 3366:3366 -v D:/docker/mysql/data:/var/lib/mysql -v D:/docker/mysql/config:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 --user=root  mysql:5.7

结果竟然也报错了:

然后感觉是不是my.cnf的编码有问题?毕竟windows和linux会存在编码上的不同。然后通过编辑器 切换编码发现:

发现这个文件竟然乱码了!!然后突然醒悟!这个文件是我使用编辑器生成的,没有控制好对应的编码格式,调整my.cnf的内容后,重新执行,问题迎刃而解:

 

 

 然后切换回docker-compose的方式启动,果然没问题了!

现在终于可以通过宿主机修改配置文件的方式调整容器内mysql的参数了。

问题总结

1.在使用window端的docker时,需要严格关注所有文件的编码格式,尽量避免因为配置文件的编码问题导致的错误发生。

2.在使用文本编辑器编辑或者新增文件时,需要通过切换不同的编码的方式,检查文件的格式是否有问题。

Docker 部署 MySQL 后更改配置文件通常可以通过以下两种常见方法: ### 方法一:重新创建容器挂载新的配置文件 这种方法适用于还未启动容器或者可以接受容器重新创建的情况。例如,若要启动 MySQL 5.7 并挂载配置文件,可使用以下命令: ```bash docker run --name mysql57 -v /home/ubuntu/mysql/my.cnf:/etc/mysql/conf.d/my.cnf -v /home/ubuntu/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7 ``` 在这个例子中,将主机上的 `/home/ubuntu/mysql/my.cnf` 配置文件挂载容器内的 `/etc/mysql/conf.d/my.cnf` 位置。若要更改配置,只需修改主机上的 `/home/ubuntu/mysql/my.cnf` 文件,然后停止并删除当前容器,再重新运行上述命令创建新容器即可。 又如,启动一个名为 mysqlMySQL 容器,并将主机的 mysql 目录挂载容器内的 `/etc/mysql/conf.d` 目录: ```bash docker run --name mysql -v /root/mysql/conf:/etc/mysql -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d -p 3307:3307 mysql:5.7 --defaults-file=/etc/mysql/my.cnf ``` 同样,修改主机上 `/root/mysql/conf` 目录下的配置文件,重新创建容器应用新配置 [^3][^4]。 ### 方法二:在运行的容器内直接修改配置文件容器已经在运行且方便重新创建,可以进入容器内部修改配置文件。 1. 进入 MySQL 容器: ```bash docker exec -it <容器名称或 ID> bash ``` 2. 找到配置文件并进行修改。例如,常见的 MySQL 配置文件位置为 `/etc/mysql/` 目录下。可以使用 `vi` 或 `nano` 等编辑器修改文件内容。 3. 修改完成后,保存文件并退出容器。 4. 重启 MySQL 服务使配置生效: ```bash docker restart <容器名称或 ID> ``` ### 示例配置文件内容 以下是一个 MySQL 配置文件示例: ```ini [mysqld] # 设置字符集 character_set_server = utf8mb4 # 设置默认时区为东八区 default-time_zone = '+8:00' # 配置 binlog # https://github.com/alibaba/canal/wiki/QuickStart log-bin=mysql-bin binlog-format=ROW server_id=1 # 禁用 dns 解析 skip-name-resolve ``` 将上述内容保存为 `my.cnf` 文件,按上述方法挂载或修改 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

馥影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值