我刚刚学习 Docker 和 compose,我搜索并观看了很多教程,但无法理解是什么导致了这个连接错误:
_mysql_connector.MySQLInterfaceError:无法连接到“localhost:3306”上的 MySQL 服务器(99)
我的文件结构: docker-compose.yml .env mysql/ 数据库.sql Dockerfile Python/ 服务器.py Dockerfile
docker-compose.yml:
version: '3.8'
services:
mysql:
build:
context: ./mysql
dockerfile: Dockerfile
restart: always
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- '3306:3306'
pythonapp:
build:
context: ./python
dockerfile: Dockerfile
depends_on:
- mysql
ports:
- '8080:8080'
python/Dockerfile:
FROM python:3.11-slim
RUN pip install mysql-connector-python && \
pip install python-dotenv
COPY . /app
WORKDIR /app
CMD ["python", "-u", "server.py"]
EXPOSE 8080
mysql/Dockerfile:
FROM mysql:latest
COPY ./database.sql /docker-entrypoint-initdb.d/
python/server.py:
from http.server import HTTPServer, BaseHTTPRequestHandler
from dotenv import load_dotenv
import mysql.connector
import json
import os
load_dotenv('../.env')
# Establish connection to MySQL
db_connection = mysql.connector.connect(
user=os.getenv('MYSQL_USER'),
password=os.getenv('MYSQL_ROOT_PASSWORD'),
host=os.getenv('_HOST'),
port=3306,
database=os.getenv('MYSQL_DATABASE'))
print("DB connected")
...
.env:
_HOST=localhost
MYSQL_DATABASE=db
MYSQL_USER=root
MYSQL_ROOT_PASSWORD=password
发现这个:PyMySQL 无法连接到本地主机上的 MySQL 和:
我尝试过_HOST=127.0.0.1、_HOST=mysql、_HOST=host.docker.internal 但错误没有改变。 还尝试第二次撰写来解决连接问题,可能是因为数据库尚未准备好连接,但出现了相同的错误。 所以 MySQL 数据库正在运行,但 python 服务器无法连接。
您正在调用
load_dotenv('../.env')
,但您的.env
文件仅存在于本地; Docker容器内没有这样的文件。
你必须找到一种方法以某种方式将其到达那里。最简单的方法是将
.env
文件移到 Python 文件夹中,然后将 COPY
移到您的 Dockerfile
中,并在代码中使用 load_dotenv('./.env')
。