python - Docker 容器无法访问同一网络上的外部 IP 地址
问题描述
我正在尝试让 python docker 容器运行。容器启动,但我无法让 pyodbc 登录到外部 MSSQL 服务器。我收到错误登录超时。
当我连接到 docker 容器时
docker exec -it 7f4 /bin/bash
和 run ping 192.168.10.3
,这是主机的 IP 地址和 SQL Server 正在运行的地方,我什么也没得到。甚至没有,没有回复。
如果我ping localhost
工作得很好,但显然这只是容器内的本地主机。
这是我的 Dockerfile
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)')
解决方案
推荐阅读
- performance - 使用 EmEditor 优化列数据中的多元素排序/去重
- mongodb - 如何从具有两个条件的数组中查询元素(MongoDB)
- python - reverse 和 reverse_lazy 的区别?
- java - 将 keycloak 与 Spring Security 集成
- r - 如何使所有数据点颜色相同?
- entity-framework-core - 如何在没有自定义 sql 的情况下在 EFCore 3.1 中选择常量值
- prolog - 寻找最大最小值集
- r - 在 Shiny 中观察多个事件的正确方法是什么?
- reactjs - 无法在 React 中配置补丁请求
- python - 无法使用线程在后台运行 python http 服务器