所以我陷入了两难的境地。我制作了一个 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/