python - 使用Python从Docker容器内获取MYSQL_TCP_ADDR?

标签 python mysql ubuntu docker

所以我陷入了两难的境地。我制作了一个 Flask 应用程序,当人们登录该应用程序时,它使用 mysql 数据库来存储用户名和密码。我的问题是,是否有一种动态方法可以在我的 Python 代码中获取 TCP 端口地址?我目前正在做的只是对路径进行硬编码,如下所示:

app.config['MYSQL_DATABASE_USER'] = 'root'
app.config['MYSQL_DATABASE_PASSWORD'] = ''
app.config['MYSQL_DATABASE_DB'] = 'UserList'
app.config['MYSQL_DATABASE_HOST'] = '172.17.0.3'

但我想要的是使主机动态化,这样如果我构建另一个 mysql 容器,我就不必每次都手动更改 IP。我知道你可以执行这个命令,

env | grep MYSQL
MYSQL_PORT_5123_TCP_ADDR=172.17.0.3
MYSQL_ENV_MYSQL_ROOT_PASSWORD=test
MYSQL_PORT_5123_TCP=tcp://172.17.0.3:5123
MYSQL_PORT_5123_TCP_PROTO=tcp
MYSQL_ENV_GOSU_VERSION=1.7
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.3:3306
MYSQL_PORT_5123_TCP_PORT=5123
MYSQL_ENV_MYSQL_VERSION=5.7.18-1debian8
MYSQL_NAME=/site-metrics/mysql
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_3306_TCP_ADDR=172.17.0.3
MYSQL_ENV_MYSQL_MAJOR=5.7
MYSQL_PORT=tcp://172.17.0.3:3306

但是有没有办法在我的 Python 脚本中做到这一点,这样我就不必每次都去摆弄它?感谢您的帮助!

最佳答案

您可以通过在同一网络上运行两个容器来实现此目的。我现在假设一个本地网络,但覆盖的工作方式相同。

$ docker network create my-network
$ docker run --name db --net my-network <other args...>
$ docker run --name web --net my-network <other args...>

然后在您的应用程序配置中:

app.config['MYSQL_DATABASE_HOST'] = 'db'

因为两个容器位于同一网络上,所以它们将能够通过 DNS 相互解析(使用它们的容器名称)。

编辑:事实上,更好的方法是使用传入的环境变量。这样您就可以两全其美。像这样的东西:

app.config['MYSQL_DATABASE_HOST'] = os.getenv('DB_HOST', 'db')

os.getenv() 的第二个参数是默认值。所以默认情况下它将使用 'db'但如果您的环境中出于某种原因需要更改它或具有不同的 Docker 服务名称,您可以使用以下命令运行容器:

$ docker run --name other_db --net my-network <other args...>
$ docker run --name web --net my-network -e DB_HOST=other_db <other args...>

然后它会尝试连接到 other_db:<port>相反。

关于python - 使用Python从Docker容器内获取MYSQL_TCP_ADDR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45195276/

相关文章:

php - 获取刚刚用mysql准备好的语句添加的记录ID

php - 如何从每组中选择最新的一个? (尝试选择每个人的最新消息并将其链接到对话)

ubuntu - wsl 2 ubuntu mariadb .my.cnf.42' 被忽略

python - google appengine, pycharm, python virtualenv 无法访问lib

python - python 脚本上的 sed 替换 - "command not found"问题

python - np.argsort 排除零值

python - 使用 Databricks 处理大量 JSON (~12TB)

php - 使用 ZF2 保存到多个表时检查空值

ubuntu - 谷歌上的网站花时间通过 https 访问 ubuntu

ubuntu - 在没有root权限的ubuntu上安装openslide及其依赖openjpeg