如何在Docker容器内的Flask应用中执行宿主机Shell命令?
解决容器内Flask应用获取宿主机IP的问题
你的代码当前执行的是容器内部的ifconfig命令,因此返回的是容器自身的IP地址。要获取宿主机的IP,以下是几种实用的解决方法,按推荐程度排序:
方案1:启动容器时注入宿主机IP作为环境变量(推荐)
这是最安全、轻量的实现方式,无需修改容器网络配置或额外部署服务。
启动容器时,通过
-e参数传递宿主机IP:# 用hostname -I获取宿主机主IP,也可替换为固定IP docker run -e HOST_IP=$(hostname -I | awk '{print $1}') 你的容器镜像名 ...修改Flask代码,直接读取环境变量:
import os from flask import jsonify @status.route("/ipaddr", methods=["GET"]) @jwt_required() def get_external_ip(): # 读取环境变量,设置默认值避免未传入的情况 host_ip = os.getenv("HOST_IP", "unknown") return jsonify(ip_address=host_ip)
方案2:共享宿主机网络命名空间启动容器
让容器直接使用宿主机的网络栈,此时容器内执行ifconfig就能获取宿主机的网卡信息。但该方式会失去容器的网络隔离性,容器端口直接暴露在宿主机上,仅适合测试环境使用。
启动容器时添加
--net=host参数:docker run --net=host 你的容器镜像名 ...原有代码无需任何修改,直接运行即可返回宿主机IP。
方案3:宿主机部署本地服务提供IP查询
如果需要在容器内执行更多宿主机命令,可在宿主机上部署一个简单的HTTP服务,容器通过Docker网关访问该服务获取结果。
宿主机上创建返回IP的Python脚本(如
host_ip_server.py):from flask import Flask import subprocess app = Flask(__name__) @app.route("/get_ip") def get_host_ip(): result = subprocess.check_output("ifconfig | grep enp1s0 -A 1 | grep 192 | awk '{print $2}'", shell=True) return result.decode('utf-8').strip() if __name__ == "__main__": # 绑定0.0.0.0允许容器访问,可自定义端口 app.run(host="0.0.0.0", port=8080)在宿主机启动该服务:
python3 host_ip_server.py &修改容器内的Flask代码,通过Docker默认网关(通常为
172.17.0.1)调用服务:import requests from flask import jsonify @status.route("/ipaddr", methods=["GET"]) @jwt_required() def get_external_ip(): try: # 替换为宿主机实际IP或Docker网关 response = requests.get("http://172.17.0.1:8080/get_ip") response.raise_for_status() return jsonify(ip_address=response.text.strip()) except requests.exceptions.RequestException as e: return jsonify(error=str(e)), 500
内容的提问来源于stack exchange,提问作者SSubedi
相关产品推荐
相关产品推荐

