Python Docker容器无法访问同一网络上的外部IP地址
我正在尝试运行python docker容器。容器启动,但我无法让pyodbc登录到外部MSSQL服务器。我得到的错误登录超时 当我使用连接到docker容器时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
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
正在运行,它正在阻止您的连接。