You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署n8n连接宿主机PostgreSQL遇EHOSTUNREACH错误求助

Docker容器化n8n连接宿主机PostgreSQL报EHOSTUNREACH错误

在Oracle Cloud服务器上部署n8n服务(通过Docker Compose以容器方式运行),同时宿主机(Canonical Ubuntu 24.04)直接安装了PostgreSQL数据库。尝试让n8n连接PostgreSQL时,持续出现EHOSTUNREACH错误,具体报错内容为:connect EHOSTUNREACH 172.17.0.1:5432。

n8n配置文件

services:
  traefik:
    image: "traefik"
    restart: always
    command:
      - "--api=true"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      - "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /mnt/personal_data/traefik_data:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro

  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: always
    ports:
      - "5678:5678"
    labels:
      - traefik.enable=true
      - traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
      - traefik.http.routers.n8n.tls=true
      - traefik.http.routers.n8n.entrypoints=web,websecure
      - traefik.http.routers.n8n.tls.certresolver=mytlschallenge
      - traefik.http.middlewares.n8n.headers.SSLRedirect=true
      - traefik.http.middlewares.n8n.headers.STSSeconds=315360000
      - traefik.http.middlewares.n8n.headers.browserXSSFilter=true
      - traefik.http.middlewares.n8n.headers.contentTypeNosniff=true
      - traefik.http.middlewares.n8n.headers.forceSTSHeader=true
      - traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME}
      - traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
      - traefik.http.middlewares.n8n.headers.STSPreload=true
      # Middleware CORS
      - traefik.http.middlewares.n8n-cors.headers.accessControlAllowOriginList=https://app.appsmith.com
      - traefik.http.middlewares.n8n-cors.headers.accessControlAllowMethods=GET,POST,OPTIONS
      - traefik.http.middlewares.n8n-cors.headers.accessControlAllowHeaders=Content-Type,Authorization
      - traefik.http.middlewares.n8n-cors.headers.accessControlMaxAge=100
      - traefik.http.middlewares.n8n-cors.headers.addVaryHeader=true
      - traefik.http.routers.n8n.middlewares=n8n@docker,n8n-cors@docker
    environment:
      - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - N8N_DEFAULT_CORS=${N8N_DEFAULT_CORS}
      - N8N_CORS_ALLOW_ORIGIN=${N8N_CORS_ALLOW_ORIGIN}
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=host.docker.internal
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
      - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
    extra_hosts:
      - "host.docker.internal:host-gateway"
    volumes:
      - /mnt/personal_data/n8n_data:/home/node/.n8n
      - /mnt/personal_data:/files

volumes:
  traefik_data:
    external: true
  n8n_data:
    external: true

n8n容器日志

User settings loaded from: /home/node/.n8n/config
Last session crashed
Initializing n8n process
There was an error initializing DB
connect EHOSTUNREACH 172.17.0.1:5432

已尝试的解决方案

  • 在postgresql.conf中设置listen_addresses='*'
  • 在pg_hba.conf中添加host all all 0.0.0.0/0 md5
  • 验证host-gateway指向的网关IP正确
  • 确认PostgreSQL监听IPv4
  • 执行sudo iptables -I DOCKER-USER -s 172.17.0.0/16 -j ACCEPT处理防火墙问题

注:上述步骤均已仔细正确执行,确保生效。

测试连接情况

使用以下命令测试容器到宿主机PostgreSQL的连接,返回成功:

docker run --rm -it \
 --add-host host.docker.internal:host-gateway \
 alpine sh -c "ping -c1 host.docker.internal && apk add bind-tools && nslookup host.docker.internal && apk add postgresql-client && nc -vz host.docker.internal 5432"

测试结果:

Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
fe07684b16b8: Pull complete
Digest: sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715
Status: Downloaded newer image for alpine:latest
PING host.docker.internal (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: seq=0 ttl=64 time=0.101 ms

--- host.docker.internal ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.101/0.101/0.101 ms
fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/community/x86_64/APKINDEX.tar.gz
(1/15) Installing fstrm (0.6.1-r4)
(2/15) Installing krb5-conf (1.0-r2)
(3/15) Installing libcom_err (1.47.2-r2)
(4/15) Installing keyutils-libs (1.6.3-r4)
(5/15) Installing libverto (0.3.2-r2)
(6/15) Installing krb5-libs (1.21.3-r0)
(7/15) Installing json-c (0.18-r0)
(8/15) Installing nghttp2-libs (1.65.0-r0)
(9/15) Installing protobuf-c (1.5.2-r0)
(10/15) Installing userspace-rcu (0.15.2-r0)
(11/15) Installing libuv (1.51.0-r0)
(12/15) Installing xz-libs (5.8.1-r0)
(13/15) Installing libxml2 (2.13.8-r0)
(14/15) Installing bind-libs (9.20.10-r0)
(15/15) Installing bind-tools (9.20.10-r0)
Executing busybox-1.37.0-r18.trigger
OK: 15 MiB in 31 packages
Server:         169.254.169.254
Address:        169.254.169.254#53

** server can't find host.docker.internal: NXDOMAIN

环境信息

  • n8n版本: 1.93.0
  • 数据库: PostgreSQL 16.9
  • n8n EXECUTIONS_PROCESS设置: own
  • 运行方式: Docker Compose 2.32.4
  • 操作系统: Canonical Ubuntu 24.04 (Linux)

内容的提问来源于stack exchange,提问作者PhDoanh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:07:03