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

时间:2017-07-19 15:41:00

标签: python mysql ubuntu docker

所以我陷入两难境地。当人们登录应用程序时,我制作了一个使用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脚本中执行此操作,所以我不必每次都这样做?谢谢你的帮助!

1 个答案:

答案 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>