以下 docker-compose.yaml 中描述的“rest”服务在启动时运行一个 python 脚本,该脚本尝试连接到“db”服务的 mysql 实例。
每次我运行 docker-compose up 时,所有服务都会成功启动,但是“rest”服务会在调试控制台中不断报告“无法连接到 mySQL db”。
该问题的一个非常奇怪的解决方法似乎是打开 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:
db:
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: