首页 > 解决方案 > Docker + Airflow - 无法从 docker 容器连接到主机上的 MySQL

问题描述

我正在使用基于 'puckel/docker-airflow:1.10.9' 图像的 dockerized Airflow。

docker-compose文件如下:

version: '3.5'

services:
  postgres:
    image: postgres:12.3-alpine
    environment:
      POSTGRES_DB: airflow
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
    ports:
      - 5432:5432
    volumes:
      - ./data/postgres:/var/lib/postgresql/data

  webserver:
    build:
      context: .
      dockerfile: docker/development/webserver/Dockerfile
    restart: always
    depends_on:
      - postgres
    environment:
      ...
    volumes:
      ...
    ports:
      - 8080:8080
    command: webserver
    healthcheck:
      test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
      interval: 30s
      timeout: 30s
      retries: 3

DAG 中的一项任务需要连接到主机上的 MySQL。

连接细节如下: 在此处输入图像描述

当我尝试触发 DAG 时,任务实例失败_mysql_exceptions.OperationalError: (2006, "Unknown MySQL server host 'host.docker.internal' (-2)")

我已经尝试过与此问题相同的方法,但问题仍然存在。

此外,这里有一些失败的 docker 网络检查:

$ docker run --rm webserver ping 'host.docker.internal'

ping: bad address 'host.docker.internal'

$ docker run --rm alpine nslookup host.docker.internal

Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
df20fa9351a1: Pull complete 
Digest: sha256:185518070891758909c9f839cf4ca393ee977ac378609f700f60a771a2dfe321
Status: Downloaded newer image for alpine:latest
Server:         192.168.100.1
Address:        192.168.100.1:53

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

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


标签: pythonmysqldockerairflowhost

解决方案


host.docker.internal是一种特殊的 DNS,仅适用于 Window 和 Mac。

您可以尝试以下解决方法来解析容器内的此 DNS --add-host,其中 IP 将引用您的主机 IP 地址192.168.9.100

docker run -it --rm=True --add-host=host.docker.internal:192.168.9.100 alpine sh -c "apk add curl --no-cache; curl host.docker.internal:8081"

或更好地使用环境变量

docker run -it --rm -e HOST_DB=192.168.9.100 myserver

然后您可以HOST_DB在 webserver 容器中使用与 HOST DB 连接。


推荐阅读