Docker Compose启动自定义MySQL 8.2.0镜像失败求助
问题排查与修复方案
1. 脚本解释器错误 /bin/sh^M: bad interpreter
原因
你的init_script.sh脚本使用了Windows风格的CRLF换行符(\r\n),而Linux容器中的Shell仅识别Unix风格的LF换行符(\n)。错误中的^M就是Windows换行符里的\r,导致系统无法匹配到正确的解释器路径。
修复方法
- 本地转换换行符:用文本编辑器打开脚本,将换行格式改为
LF:- Notepad++:编辑 → 文档格式转换 → 转换为UNIX格式
- VS Code:点击右下角的
CRLF选项,选择LF后保存
- Dockerfile自动处理:在复制脚本后添加换行符转换步骤(需先安装工具):
FROM bitnami/mysql:8.2.0-debian-11-r2 RUN apt-get update && apt-get install -y dos2unix && rm -rf /var/lib/apt/lists/* COPY init_script.sh /docker-entrypoint-initdb.d/ RUN dos2unix /docker-entrypoint-initdb.d/init_script.sh
2. MySQL端口映射错误(映射为5432)
原因
MySQL默认端口为3306,你将其映射到了主机的5432端口(PostgreSQL默认端口),会引发两种问题:
- 若主机已运行PostgreSQL,会出现端口冲突导致容器启动失败
- 客户端连接时用错端口,无法正常访问MySQL服务
修复方法
修改Docker Compose的端口映射配置,将主机端口改为3306(或其他未被占用的端口):
services: mysql: build: . ports: - "3306:3306" # 格式为「主机端口:容器端口」,容器端必须保持3306 # 其他配置项...
3. 初始化脚本中创建用户与授权不匹配
原因
脚本里CREATE USER语句的用户标识(含主机范围,如@localhost、@%)和GRANT语句中的用户标识不一致,会导致授权无效或直接报错。
修复方法
确保创建用户和授权的用户标识完全一致:
- 错误示例:
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword'; GRANT ALL ON mydb.* TO 'myuser'@'%'; # 主机范围不匹配 - 正确示例:
# 创建允许任意主机连接的用户 CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword'; # 给该用户授权指定数据库的所有权限 GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%'; FLUSH PRIVILEGES; # 刷新权限使设置生效
内容的提问来源于stack exchange,提问作者user1999453
相关产品推荐
相关产品推荐

