问题重现
最近在研究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.在使用文本编辑器编辑或者新增文件时,需要通过切换不同的编码的方式,检查文件的格式是否有问题。