Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Docker容器无法访问同一网络上的外部IP地址_Python_Sql Server_Docker_Pyodbc - Fatal编程技术网

Python Docker容器无法访问同一网络上的外部IP地址

Python Docker容器无法访问同一网络上的外部IP地址,python,sql-server,docker,pyodbc,Python,Sql Server,Docker,Pyodbc,我正在尝试运行python docker容器。容器启动,但我无法让pyodbc登录到外部MSSQL服务器。我得到的错误登录超时 当我使用连接到docker容器时 docker exec -it 7f4 /bin/bash 然后运行ping 192.168.10.3,这是主机的IP地址,也是运行SQL Server的地方,我什么也没有得到。甚至没有,没有回答 如果我ping localhost,效果很好,但显然这只是容器中的localhost 这是我的文件 FROM python:3.7.4-s

我正在尝试运行python docker容器。容器启动,但我无法让pyodbc登录到外部MSSQL服务器。我得到的错误登录超时

当我使用连接到docker容器时

docker exec -it 7f4 /bin/bash
然后运行
ping 192.168.10.3
,这是主机的IP地址,也是运行SQL Server的地方,我什么也没有得到。甚至没有,没有回答

如果我
ping localhost
,效果很好,但显然这只是容器中的localhost

这是我的文件

FROM python:3.7.4-stretch

RUN apt-get update \

# && apt-get install g++ \

&& apt-get install --yes unixodbc-dev \

&& pip install pyodbc==4.0.27

# --- Install Microsoft ODBC Driver

# https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

RUN curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list

# Need some certificate fix to install msodbcsql17

RUN apt-get install --yes apt-transport-https ca-certificates \

&& apt-get update && ACCEPT_EULA=Y apt-get install --yes msodbcsql17

WORKDIR /app



COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . /app
CMD [ "uvicorn", "app:app", "--port", "8000"]
这是我得到的错误

Traceback (most recent call last):
  File "/usr/local/bin/uvicorn", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/uvicorn/main.py", line 355, in main
    run(**kwargs)
  File "/usr/local/lib/python3.7/site-packages/uvicorn/main.py", line 379, in run
    server.run()
  File "/usr/local/lib/python3.7/site-packages/uvicorn/main.py", line 407, in run
    loop.run_until_complete(self.serve(sockets=sockets))
  File "/usr/local/lib/python3.7/asyncio/base_events.py", line 579, in run_until_complete
    return future.result()
  File "/usr/local/lib/python3.7/site-packages/uvicorn/main.py", line 414, in serve
    config.load()
  File "/usr/local/lib/python3.7/site-packages/uvicorn/config.py", line 300, in load
    self.loaded_app = import_from_string(self.app)
  File "/usr/local/lib/python3.7/site-packages/uvicorn/importer.py", line 20, in import_from_string
    module = importlib.import_module(module_str)
  File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "./app.py", line 21, in <module>
    cursor = db.get_cursor(db.get_db_connection())
  File "./db.py", line 8, in get_db_connection
    return pyodbc.connect(f"DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={os.getenv('DB_HOST')},{os.getenv('DB_PORT')};DATABASE={os.getenv('DB_DATABASE')};UID={os.getenv('DB_USERNAME')};PWD={os.getenv('DB_PASSWORD')}")
pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
回溯(最近一次呼叫最后一次):
文件“/usr/local/bin/uvicorn”,第8行,在
sys.exit(main())
文件“/usr/local/lib/python3.7/site packages/click/core.py”,第829行,在调用中__
返回self.main(*args,**kwargs)
文件“/usr/local/lib/python3.7/site packages/click/core.py”,第782行,在main中
rv=自调用(ctx)
文件“/usr/local/lib/python3.7/site packages/click/core.py”,调用中的第1066行
返回ctx.invoke(self.callback,**ctx.params)
文件“/usr/local/lib/python3.7/site packages/click/core.py”,调用中的第610行
返回回调(*args,**kwargs)
文件“/usr/local/lib/python3.7/site packages/uvicorn/main.py”,第355行,在main中
运行(**kwargs)
文件“/usr/local/lib/python3.7/site packages/uvicorn/main.py”,第379行,正在运行
server.run()
文件“/usr/local/lib/python3.7/site packages/uvicorn/main.py”,第407行,正在运行
循环运行直到完成(自助服务(sockets=sockets))
文件“/usr/local/lib/python3.7/asyncio/base\u events.py”,第579行,运行直到完成
返回future.result()
文件“/usr/local/lib/python3.7/site packages/uvicorn/main.py”,第414行,在serve中
config.load()
文件“/usr/local/lib/python3.7/site packages/uvicorn/config.py”,第300行,已加载
self.loaded_app=从_字符串导入_(self.app)
文件“/usr/local/lib/python3.7/site packages/uvicorn/importer.py”,第20行,从字符串导入
module=importlib.import\u模块(module\u str)
文件“/usr/local/lib/python3.7/importlib/_init__uuu.py”,第127行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
文件“”,第1006行,在\u gcd\u导入中
文件“”,第983行,在_find_和_load中
文件“”,第967行,在“查找”和“加载”中解锁
文件“”,第677行,在\u加载\u解锁
exec_模块中第728行的文件“”
文件“”,第219行,在“调用”中,删除了“帧”
文件“/app.py”,第21行,在
cursor=db.get\u cursor(db.get\u db\u connection())
文件“/db.py”,第8行,在get\u db\u连接中
返回pyodbc.connect(f“DRIVER={{ODBC DRIVER 17 for SQL Server}}};Server={os.getenv('DB_HOST')},{os.getenv('DB_PORT')};DATABASE={os.getenv('DB_DATABASE')};UID={os.getenv('DB_USERNAME')};PWD={os.getenv('DB_PASSWORD')})
pyodbc.OperationalError:('HYT00','[HYT00][Microsoft][ODBC驱动程序17 for SQL Server]登录超时已过期(0)(SQLDriverConnection)')

试试这个:你的路由正确吗?你确定没有防火墙阻止你的连接吗?e、 g.网络超时表明网络存在问题。对于
ping
请求,没有返回任何内容可能只是意味着您正在丢弃ICMP数据包(不能信任
ping
),数据库的
telnet服务器端口
?我想这一定与我的Macbook有关。我已经把同样的图像放在我的天气预报上,效果很好。不幸的是,我现在没有时间做更多的测试。我将不得不在晚些时候再谈这个问题。谢谢你的建议。我没有Macbook可以测试,但我知道。我怀疑在虚拟机中运行着防火墙,
docker
正在运行,它正在阻止您的连接。