错误试图运行docker-compose与flask应用程序和Mysql数据库



当运行docker-compose up时,我得到这个错误,我不知道为什么,试着研究它,但我发现的所有解决方案都不起作用。如果有人知道,如果你能分享就太棒了。谢谢!

误差

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'mysql' ([Errno -2] Name or service not known)")

这是我的docker-compose.yml文件。它有2个需要构建的映像。

docker-compose.yml

version: "3.7"
services:
web:
build: .
depends_on:
- mysql
ports:
- 5000:5000
links:
- mysql
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: 12345678
MYSQL_DB: flaskmysql
mysql:
image: mysql:5.7
ports:
- "32000:3306"
volumes:
- ./mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 12345678
MYSQL_DATABASE: flaskmysql
volumes:
mysql-data:

这是我的Dockerfile,包含运行我的应用程序的所有步骤。

Dockerfile

FROM python:3.9-slim-buster
RUN apt-get update && apt-get install -y git python3-dev gcc gfortran libopenblas-dev liblapack-dev 
&& rm -rf /var/lib/apt/lists/* 
COPY requirements.txt .
RUN pip install --upgrade -r requirements.txt
COPY app app/
RUN python app/server.py
EXPOSE 5000
CMD ["python", "app/server.py", "serve"]

这里我已经有了尝试连接到docker-compose使用给定图像创建的服务的代码行。

Server.py

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']= 'mysql+pymysql://root:12345678@mysql:3306/flaskmysql'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']= False

我相信你在这里遇到了竞争条件。尽管您已经为应用程序指定了depends_on依赖项,但请注意,docker-compose在继续下一步之前不会"等待"数据库可用。这是因为docker-compose不"知道"。这项服务"准备就绪"意味着什么?

这意味着,只要容器处于"运行"状态(可以仍在初始化数据库),docker-compose将继续尝试为您的应用程序构建映像,并运行应用程序,该应用程序试图连接尚未准备好的数据库。这里可以做两件事:

  1. 在应用程序中添加等待循环以尝试重试。推荐
  2. 添加wait-for-it解决方案到你的docker组合设置。

你可以在docker文档中找到更多关于启动顺序设置的详细信息。

我建议在你的应用程序中添加一个简单的重试循环:)

最新更新