我对我的Docker容器行为感到非常惊讶。我有一个带有mariadb数据库的flask应用程序。它在容器外,在我的本地机器上没有问题。更令人困惑的是,有时docker compose up
工作正常,有时它崩溃。通常当我已经做了docker compose up
至少一次时,chrash就会发生,停止并删除容器app
和db
并重新执行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
和仍然有同样的错误。
任何见解或想法,问题可能来自哪里?
1条答案
按热度按时间ki1q1bka1#
感谢@Hans和@大卫的评论,我使用Docker compose healthchecks解决了这个问题
下面是我的
docker-compose.yml
,其余的保持不变:字符串