docker容器(flask + mariadb)工作,然后崩溃,错误“2003:无法连接到MySQL服务器上'db:3306'(111连接拒绝)”

vom3gejh  于 5个月前  发布在  Docker
关注(0)|答案(1)|浏览(63)

我对我的Docker容器行为感到非常惊讶。我有一个带有mariadb数据库的flask应用程序。它在容器外,在我的本地机器上没有问题。更令人困惑的是,有时docker compose up工作正常,有时它崩溃。通常当我已经做了docker compose up至少一次时,chrash就会发生,停止并删除容器appdb并重新执行docker compose up,它们出现错误:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'db:3306' (111 Connection refused)
这是我的docker-compose.yml(我已经删除了所有的networks:块,现在使用compose默认网络,但问题仍然是一样的,有时它工作,有时不工作)

version: '3'

services:
    app:
        build: .
        depends_on:
            - db
        environment:
            - DB_HOST=db
            - DB_USER=root
            - DB_PASSWORD=$DB_PASSWORD
            - DB=Catach
        ports:
            - 5000:5000
        volumes:
            - ./caisse:/src
    db:
        image: mariadb:latest
        environment:
            - MYSQL_ROOT_PASSWORD=$DB_PASSWORD
            - MYSQL_DATABASE=Catach
        volumes:
            - mariadb_data:/var/lib/mysql

volumes:
    mariadb_data:
        driver: local

字符串
我的DB_PASSWORD位于.yml的同一位置的.env文件中:

DB_PASSWORD="mypassword"


这是我的Dockerfile

FROM python:3-alpine

COPY caisse/ /src
RUN pip install -r /src/requirements.txt

WORKDIR /src
CMD ["python3", "app.py"]


最后,这是我的app.py的mariadb数据库连接

from flask import Flask, url_for, render_template, request, flash, redirect, send_file
import mysql.connector as mariadb
import os
import datetime
from xlsxwriter import Workbook
from utils import export_db

#Paramètres de connexion MariaDB
mariadb_host = os.environ.get('DB_HOST')
mariadb_user = os.environ.get('DB_USER')
mariadb_pwd = os.environ.get('DB_PASSWORD')
mariadb_db = os.environ.get('DB')

#Connection (et création si nécessaire) de la base de données
app_db = mariadb.connect(host=mariadb_host, user=mariadb_user, password=mariadb_pwd)


我已经搜索了许多现有的线程,但大多数问题是主机db没有正确指定,我想我做到了。
我也试过删除我的应用程序图像的容器,重新拉mariadb图像等。我不能找出任何模式,当错误发生时,或当它不。似乎当删除我的应用程序图像与docker rmi,它的工作“更频繁”,但它是不健全的,虽然因为有时我确实删除了图像,并重建它与我的docker compose up和仍然有同样的错误。
任何见解或想法,问题可能来自哪里?

ki1q1bka

ki1q1bka1#

感谢@Hans和@大卫的评论,我使用Docker compose healthchecks解决了这个问题
下面是我的docker-compose.yml,其余的保持不变:

version: '3'

services:
   app:
       build: .
       depends_on:
           db:
               condition: service_healthy
       environment:
           - DB_HOST=db
           - DB_USER=root
           - DB_PASSWORD=$DB_PASSWORD
           - DB=Catach
       ports:
           - 5000:5000
       volumes:
           - ./caisse:/src
   db:
       image: mariadb:latest
       environment:
           - MYSQL_ROOT_PASSWORD=$DB_PASSWORD
           - MYSQL_DATABASE=Catach
       volumes:
           - mariadb_data:/var/lib/mysql
       healthcheck:
           test: "mariadb $$MYSQL_DATABASE -uroot -p$$MYSQL_ROOT_PASSWORD -e 'SELECT 1;'"
           interval: 2s
           timeout: 2s
           retries: 10

volumes:
   mariadb_data:
       driver: local

字符串

相关问题