1

以下 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:
4

0 回答 0