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
相关产品推荐
相关产品推荐

