无法使用Docker compose连接python服务器和mysql

问题描述 投票:0回答:1

我刚刚学习 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 服务器无法连接。

docker docker-compose dockerfile mysql-python
1个回答
0
投票

您正在调用

load_dotenv('../.env')
,但您的
.env
文件仅存在于本地; Docker容器内没有这样的文件。

你必须找到一种方法以某种方式将其到达那里。最简单的方法是将

.env
文件移到 Python 文件夹中,然后将
COPY
移到您的
Dockerfile
中,并在代码中使用
load_dotenv('./.env')

© www.soinside.com 2019 - 2024. All rights reserved.