自定义Docker镜像构建成功,容器内无法使用mysql-connector-python
问题:Docker部署Python应用时遭遇
ModuleNotFoundError: No module named 'mysql' 我正在部署一个连接本地MySQL服务器的小型Python应用,项目结构如下:
- 代码位于
./fzwk-app/目录,其中包含database模块及DBController.py文件,核心代码如下:
class DbController(object): def __init__(self): self._db_connection = mysql.connector.connect( host='localhost', user='foo', passwd='bar', database='mydb' ) self._db_cur = self._db_connection.cursor() # ...
本地运行./fzwk-app/__init__.py时数据库连接完全正常,但部署到Docker容器时遇到了问题。我编写的Dockerfile内容如下:
FROM python:3.6 ADD ./fzwk-app/ / RUN pip3 install mysql-connector CMD [ "python", "./__init__.py" ]
使用docker build -t fzwk-app:0.1 .构建镜像成功,但执行docker run fzwk-app运行容器时,出现了如下回溯错误:
Traceback (most recent call last): File "./__init__.py", line 21, in <module> from database import DbController as db File "/database/DbController.py", line 18, in <module> import mysql.connector ModuleNotFoundError: No module named 'mysql'
请问我的问题出在哪里?
解决方案
1. 核心问题:安装了错误的Python包
你遇到的ModuleNotFoundError是因为你安装的mysql-connector包并不是提供mysql.connector模块的正确包。实际上,mysql.connector这个模块来自于mysql-connector-python包,而mysql-connector是一个早已废弃的同名包,根本不包含你需要的模块。
修改Dockerfile中的安装命令,替换为正确的包名:
RUN pip3 install mysql-connector-python
2. 额外优化建议
用requirements.txt管理依赖:为了避免类似的依赖乌龙,建议在项目根目录创建
requirements.txt文件,写入需要的依赖包:mysql-connector-python然后在Dockerfile中改用以下命令安装,这样更便于维护依赖版本,也能避免手动输入错误:
RUN pip3 install -r requirements.txt提前解决数据库连接的后续问题:搞定模块问题后,你很快会遇到新的坑——容器内的
localhost指向容器自身,而不是宿主机的MySQL服务器。解决方法如下:- Linux/macOS环境:把
host改为host.docker.internal,这是Docker内置的指向宿主机的域名; - Windows环境或上述域名失效时:直接使用宿主机的实际IP地址;
- 同时要确保宿主机的MySQL服务器允许外部连接:修改MySQL配置的
bind-address为0.0.0.0,并给foo用户授权外部访问权限(比如GRANT ALL ON mydb.* TO 'foo'@'%' IDENTIFIED BY 'bar';)。
- Linux/macOS环境:把
3. 优化后的完整Dockerfile示例
FROM python:3.6 ADD ./fzwk-app/ /app WORKDIR /app RUN pip3 install mysql-connector-python CMD [ "python", "__init__.py" ]
这里额外添加了WORKDIR /app,把容器的工作目录切换到应用目录,执行命令时路径更清晰,也能避免潜在的路径问题。
内容的提问来源于stack exchange,提问作者appfrosch
相关产品推荐
相关产品推荐

