“无法连接到'mysql'上的MySQL服务器([Errno 111]连接被拒绝)”,但可以手动启动

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

我正在尝试运行 Docker + Flask + MySQL,这是我的

docker-compose.yaml
:


services:
  dockerflaskexample:
    image: dockerflaskexample
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 5002:5002
    volumes:
      - app_code:/app
    depends_on:
      - mysql
    container_name: dockerflaskexample
  mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: webapp-db-root-password
      MYSQL_DATABASE: webapp-db
      MYSQL_USER: webapp-db-user
      MYSQL_PASSWORD: webapp-db-password
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
volumes:
  mysql_data:
  app_code:

...并在

__init__.py
:

# Establishing a connection to the MySQL database
connection = pymysql.connect(
    host='mysql',
    database='webapp-db',
    user='webapp-db-user',
    password='webapp-db-password',
    port=3306,
    charset='utf8mb4',  # adjust charset if necessary
)

我撰写完成后,容器

dockerflaskexample
总是失败并出现以下错误:

2024-04-02 16:25:05 pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'mysql' ([Errno 111] Connection refused)")

但是,如果我只是再次运行

Exited (3)
容器,它就可以工作了。

我可以知道为什么会这样吗?是因为 webapp 启动时

mysql
还没有准备好吗?

mysql docker flask
2个回答
0
投票

你的直觉是正确的(你需要等待数据库启动)。您可以使用 Docker Compose 或使用 Python 等待。

虽然它正在等待 rabbitMQ 服务,但这里说明了 Docker Compose 解决方案。您需要不同的

healthcheck
来进行 mysql 服务配置:

    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 10s
      retries: 3

0
投票

这似乎是网络问题。您正在尝试使用

host
作为
container_name
,这需要将两个容器添加到同一网络。网络可以在
.yml
文件的底部定义(也可以是外部的)。

请检查示例。

services:
  dockerflaskexample:
    ...
    networks:
      - service-network
  mysql:
    ...
    networks:
      - service-network

...

networks:
  service-network:
    name: service-network

另请检查 - https://docs.docker.com/compose/networking/#specify-custom-networks

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