首页 > 解决方案 > 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)')

标签: pythonsql-serverdockerpyodbc

解决方案


推荐阅读