使用Python从Docker容器中获取MYSQL_TCP_ADDR?

所以我有一个困境。 我做了一个Flask应用程序,当人们login到应用程序时,它使用一个mysql数据库来存储用户名和密码。 我的问题是,有没有一种dynamic的方式来获取我的Python代码中的TCP端口地址它自己? 我现在正在做的只是硬编码的path如下所示:

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' 

但我想要的是使主机dynamic,所以如果我build立另一个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脚本中这样做,所以我不必每次都摆弄这个? 谢谢您的帮助!

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

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

然后在你的应用程序configuration:

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

因为两个容器在同一个networking上,他们将能够通过DNS(使用他们的容器名称)解决彼此。

编辑:事实上,一个更好的方法是通过一个envvariables来传递。然后你拥有两全其美的优点。 就像是:

 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>