首页 > 解决方案 > 使用 Python 连接到 Docker 容器中的 MySQL

问题描述

我正在使用 pony.orm 使用 python 代码连接到 mysqldb:

db.bind(provider='mysql', user=username, password=password, host='0.0.0.0', database=database)

当我编写 docker compose 文件时:

  db:
    image: mariadb
    ports:
      - "3308:3306"
    environment:
      MYSQL_DATABASE: db
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: ''

如何通过在 docker-compose.yml 文件中给出一个值(在环境中:)将主机名传递给 python 程序?

如果我传递该值,我可以通过 Python 代码中的 os.environ['PARAM'] 访问该值吗?

标签: pythonpython-3.xdockerponyorm

解决方案


因为您已在 中命名您的服务db,所以docker-compose.yaml您可以将其用作host,前提是您在同一网络上:

db.bind(provider='mysql', user=username, password=password, host='db', database=database)

为确保您在该网络上,在docker-compose.yaml底部的 中,您需要:

networks:
  default:
    external:
      name: <your-network>

您需要在运行之前创建该网络docker-compose up

docker network create <your-network>

这避免了对环境变量的需要,因为容器名称将被添加到网络的路由表中。

不需要定义自己的网络,因为docker-compose它将为您处理,但如果您希望更明确一点,它可以让您灵活地这样做。通常,您会将此保留用于要在单个网络上加入的多个撰写解决方案,但此处并非如此。

它的处理docker-compose方式与您在 vanilla中的处理方式相同docker

docker run -d -p 3308:3306 --network <your-network> --name db mariadb
docker run -it --network <your-network> ubuntu bash

# in the shell of the ubuntu container
apt-get update && apt-get install iputils-ping -y
ping -c 5 db

# here you will see the results of ping reaching container db
5 packets transmitted, 5 received, 0% packet loss, time 4093ms

编辑

请注意,根据@DavidMaze 的评论,您将与之通信的端口是 3306,因为这是容器正在侦听的端口,而不是 3308。


推荐阅读