当运行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
将继续尝试为您的应用程序构建映像,并运行应用程序,该应用程序试图连接尚未准备好的数据库。这里可以做两件事:
- 在应用程序中添加等待循环以尝试重试。推荐。
- 添加
wait-for-it
解决方案到你的docker组合设置。
你可以在docker文档中找到更多关于启动顺序设置的详细信息。
我建议在你的应用程序中添加一个简单的重试循环:)