下面docker-compose.yaml中描述的 "rest "服务在启动时运行一个python脚本,试图连接到 "db "服务的mysql实例。
每次我运行docker-compose时,所有的服务都能成功启动,但是 "rest "服务在调试控制台上不断地报告 "无法连接到mySQL数据库"。
一个非常奇怪的解决方法似乎是先打开phpMyAdmin,并通过它登录到mySQL实例。 一旦我从 phpMyAdmin 登录到 mySQL 数据库,我回到 docker-compose 控制台,我看到 "rest "python 脚本已经成功建立了数据库连接。
我反复验证了这种行为,但我不明白为什么mySQL实例需要我先用phpMyAdmin登录,然后才能让python脚本建立自己的连接。
我的Python/Tortoise连接代码如下。
DATABASE_URL = "mysql://{}:{}@{}:{}/{}".format(
os.environ["MYSQL_USER"],
os.environ["MYSQL_PASSWORD"],
os.environ["MYSQL_HOST"],
os.environ["MYSQL_PORT"],
os.environ["MYSQL_DATABASE"],
register_tortoise(
app, db_url=DATABASE_URL, modules={"models": ["models"]}, generate_schemas=False
Docker-compose.yaml
services:
image: mysql:latest
restart: always
environment:
MYSQL_DATABASE: "bbms"
MYSQL_USER: "bbms"
MYSQL_PASSWORD: "B37PTdaWvbUQm"
MYSQL_ROOT_PASSWORD: "asdasdasdasd"
ports:
- "3306:3306"
volumes:
- dbdata:/var/lib/mysql
phpmyadmin:
image: phpmyadmin:latest
depends_on: [ db ]
ports:
- "8080:80"
environment:
- PMA_HOST=db
- PMA_PORT=3306
restart: unless-stopped
rest:
build:
context: ./
dockerfile: ./docker/rest/Dockerfile
restart: always
depends_on: [ db ]
environment:
MYSQL_DATABASE: "bbms"
MYSQL_USER: "bbms"
MYSQL_PASSWORD: "B37PTdaWvbUQm"
MYSQL_HOST: db
MYSQL_PORT: 3306
volumes:
- ./src:/app
ports:
- "5000:5000"
networks:
default:
name: qibbms_net
ipam:
driver: default
config:
- subnet: "172.12.2.0/24"
volumes:
dbdata: