所以我陷入两难境地。当人们登录应用程序时,我制作了一个使用mysql数据库存储用户名和密码的Flask应用程序。我的问题是,有一种动态的方法来获取我自己的Python代码中的TCP端口地址吗?我目前正在做的就是硬编码这样的路径:
/etc/hosts
但我想要的是让主机动态,所以如果我构建另一个mysql容器,我不必每次都手动更改IP。我知道你可以做这个命令,
map $wanted_host $wanted_host_ip
{
default 127.0.0.1;
b.dev.local X.X.X.X;
a.dev.local X.X.X.X;
}
server
{
listen 80;
server_name ~^(?P<wanted_port>[0-9]+?)-(?P<wanted_host>.+?)\.HOSTNAME$;
location /
{
proxy_pass http://$wanted_host_ip:$wanted_port;
}
}
但是有没有办法在我的Python脚本中执行此操作,所以我不必每次都这样做?谢谢你的帮助!
答案 0 :(得分: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:<port>
。