我正在尝试运行 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
还没有准备好吗?
你的直觉是正确的(你需要等待数据库启动)。您可以使用 Docker Compose 或使用 Python 等待。
虽然它正在等待 rabbitMQ 服务,但这里说明了 Docker Compose 解决方案。您需要不同的
healthcheck
来进行 mysql 服务配置:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 3
这似乎是网络问题。您正在尝试使用
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