Docker

psycopg2.OperationalError:無法連接到伺服器:沒有到主機的路由伺服器是否在主機“db”上執行並接受埠上的 TCP/IP 連接

  • June 20, 2021

在使用 Docker 版本 20.10.6-ce,建構 8728dd246c3a 的 openSUSE Tumbleweed 上,按照此處的說明操作即可

https://github.com/mirumee/saleor-platform#how-to-run-it

但是在帶有 Docker 版本 19.03.15 的 openSUSE Leap 15.3 上,建構 99e3ed89195cmigrate命令(最後一個命令)會引發錯誤:

$ git clone https://github.com/mirumee/saleor-platform.git --recursive --jobs 3
$ cd saleor-platform
$ docker-compose build
$ docker-compose run --rm api python3 manage.py migrate

錯誤

psycopg2.OperationalError:無法連接到伺服器:沒有到主機的路由伺服器是否在主機“db”(172.21.0.4)上執行並接受埠 5432 上的 TCP/IP 連接?

錯誤日誌

m3@localhost:~/repos/saleor-platform> docker-compose run --rm api python3 manage.py migrate
Creating network "saleor-platform_default" with the default driver
Creating network "saleor-platform_saleor-backend-tier" with driver "bridge"
Creating saleor-platform_jaeger_1 ... done
Creating saleor-platform_db_1     ... done
Creating saleor-platform_redis_1  ... done
Traceback (most recent call last):
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
   self.connect()
 File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
   return func(*args, **kwargs)
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
   self.connection = self.get_new_connection(conn_params)
 File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
   return func(*args, **kwargs)
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
   connection = Database.connect(**conn_params)
 File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
   conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: No route to host
       Is the server running on host "db" (172.21.0.4) and accepting
       TCP/IP connections on port 5432?


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
 File "manage.py", line 10, in <module>
   execute_from_command_line(sys.argv)
 File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
   utility.execute()
 File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
   self.fetch_command(subcommand).run_from_argv(self.argv)
 File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
   self.execute(*args, **cmd_options)
 File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
   output = self.handle(*args, **options)
 File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 85, in wrapped
   res = handle_func(*args, **kwargs)
 File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 92, in handle
   executor = MigrationExecutor(connection, self.migration_progress_callback)
 File "/usr/local/lib/python3.8/site-packages/django/db/migrations/executor.py", line 18, in __init__
   self.loader = MigrationLoader(self.connection)
 File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 53, in __init__
   self.build_graph()
 File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 216, in build_graph
   self.applied_migrations = recorder.applied_migrations()
 File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
   if self.has_table():
 File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 55, in has_table
   with self.connection.cursor() as cursor:
 File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
   return func(*args, **kwargs)
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 259, in cursor
   return self._cursor()
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 235, in _cursor
   self.ensure_connection()
 File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
   return func(*args, **kwargs)
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
   self.connect()
 File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
   raise dj_exc_value.with_traceback(traceback) from exc_value
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
   self.connect()
 File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
   return func(*args, **kwargs)
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
   self.connection = self.get_new_connection(conn_params)
 File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
   return func(*args, **kwargs)
 File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
   connection = Database.connect(**conn_params)
 File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
   conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: could not connect to server: No route to host
       Is the server running on host "db" (172.21.0.4) and accepting
       TCP/IP connections on port 5432?

m3@localhost:~/repos/saleor-platform> 

試過了

可能是由於作業系統設置。我通過防火牆將 PostgreSQL 埠添加5432到公共埠,但仍然收到錯誤。

試過了

沒用:

  • 重啟 Docker 服務
  • 重新啟動機器

試過了

以下命令沒有幫助:

https://stackoverflow.com/a/57502873/3405291

通過以下方式獲取Subnet( 172.19.0.0/16):

docker network ls
docker inspect ${NETWORK_NAME}

然後:

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.19.0.0/16 accept'
sudo firewall-cmd --reload
sudo systemctl restart docker.service

試過了

這種方法不起作用,即將它添加到docker-compose.yml文件內的數據庫服務中:

    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust

https://unix.stackexchange.com/a/589519/158683

在 openSUSE Leap 15.3 上更新到 Docker 20 解決了以下錯誤:

m3@dhcppc3:~> docker -v
Docker version 20.10.6-ce, build 8728dd246c3a

引用自:https://serverfault.com/questions/1065809