【问题标题】:Getting MYSQL_TCP_ADDR From within Docker container using Python?使用 Python 从 Docker 容器中获取 MYSQL_TCP_ADDR?
【发布时间】:2017-12-25 00:05:15
【问题描述】:

所以我进退两难了。我制作了一个 Flask 应用程序,当人们登录应用程序时,它使用 mysql DB 来存储用户名和密码。我的问题是,是否有一种动态方法可以在我的 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 脚本中做到这一点,这样我就不必每次都摆弄这个?感谢您的帮助!

【问题讨论】:

  • 将它们添加到同一个网络并通过dns引用它们。
  • @johnharris85 你能更深入地解释一下吗?我知道你的意思,但我不确定如果有意义的话我将如何实施。
  • 在 docker-compose 中查找 --link 参数以获取 docker run 或使用 links 部分。这将创建一个您可以联系 mysql 容器的主机名。
  • --link 已弃用 @Grimmy 以支持网络。

标签: python mysql ubuntu docker


【解决方案1】:

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

$ 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(使用它们的容器名称)相互解析。

编辑:实际上,更好的方法是使用传入的 env 变量。然后你就可以两全其美了。比如:

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:&lt;port&gt;

【讨论】:

  • 好吧,酷!这更有意义,同时我发现了这种方式,如果这适用或者你的方式更好的话,lmk。我只是做一个“myhost = os.environ.get('MYSQL_PORT_3306_TCP_ADDR)”,然后将 HOST 设置为该变量。
  • 这行得通,但我的方式是“最好”的方式,因为容器内没有任何依赖项。如果适用,稍后使用网络/服务网格处理所有事情。我相信这些环境变量也仅在使用 --link 时才编写,这已被弃用。哦,最大的问题是,这些只是在启动时编写的,如果你的数据库出现故障并重新启动,Docker 不会在你的 Web 容器中编辑这些环境变量,所以一切都会中断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2021-10-19
  • 2022-01-14
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多