【问题标题】:Can't connect to postgres database in airflow using docker无法使用docker连接到气流中的postgres数据库
【发布时间】:2021-02-11 17:17:10
【问题描述】:

我正在尝试使用 Airflow 连接到 PostgreSQL 数据库,但我遇到了一个我似乎无法弄清楚的问题。对于 tl;dr,我的帖子底部包含尝试在气流 dag 中创建 postgres 表时遇到的错误。

我将docker-composethe puckel image 一起使用,但我已经扩展了它以供我使用,所以l/custom_airflow:1.5 只是我调整后的图像以包含一些python 依赖项——它只是抓取puckel 图像和pip 安装我自己的部门。这是我的docker-compose 文件:

version: '3.7'
services:
    postgres:
        image: postgres:9.6
        environment:
            - POSTGRES_USER=airflow
            - POSTGRES_PASSWORD=airflow
            - POSTGRES_DB=airflow
        logging:
            options:
                max-size: 10m
                max-file: "3"

    db:
        image: postgres:13.0-alpine
        restart: always
        environment:
            POSTGRES_DB: postgres
            POSTGRES_USER: admin_user
            POSTGRES_PASSWORD: secret_password
            POSTGRES_HOST_AUTH_METHOD: trust
            # PGDATA: /var/lib/postgresql/data
        volumes:
            - db-data:/var/lib/postgresql/data
        ports:
            - "5439:5432"
         
    pgadmin:
        image: dpage/pgadmin4:4.27
        restart: always
        environment:
            PGADMIN_DEFAULT_EMAIL: admin@test.com
            PGADMIN_DEFAULT_PASSWORD: test
            PGADMIN_LISTEN_PORT: 1111
        ports:
        - "1111:1111"
        volumes:
            - pgadmin-data:/var/lib/pgadmin
        links:
            - "db:pgsql-server"

    webserver:
        image: l/custom_airflow:1.5
        container_name: l_custom_airflow
        restart: always
        depends_on:
            - postgres
        environment:
            - LOAD_EX=n
            - EXECUTOR=Local
        logging:
            options:
                max-size: 10m
                max-file: "3"
        volumes:
            - ./dags:/usr/local/airflow/dags
            - ./db-data:/usr/local/airflow/db-data
            - ./pgadmin-data:/usr/local/airflow/pgadmin-data
        ports:
            - "8080:8080"
        command: webserver
        healthcheck:
            test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
            interval: 30s
            timeout: 30s
            retries: 3

volumes:
    db-data: 
    pgadmin-data:

虽然气流使用服务postgres 来存储它自己的有关DAG 的数据,但我创建了第二个名为db 的postgres 服务,以便它是独立的,并将其设置在端口5439 上。 这一切似乎运行良好。当我检查docker container ls 显示postgres 容器名为pipeline_5_db_1 时,检查docker network ls 并使用docker container inspect l_custom_airflow | grep Network 检查容器似乎表明它们都映射到同一个网络。 在气流 UI 中,我选择 Admin-->Connections-->Create 并填写以下内容:

然后我有我的简单 dag:

from airflow.models import DAG
from airflow.utils.dates import days_ago
from airflow.operators.python_operator import PythonOperator
from airflow.operators.postgres_operator import PostgresOperator

args = {'start_date': days_ago(1)}

dag = DAG(
    dag_id='testing_dag',
    default_args=args, 
    schedule_interval=None
    )


with dag:

    op1 = PostgresOperator(
        task_id = "make_a_staging_table",
        postgres_conn_id = "my_pg_connection",
        sql = """CREATE TABLE scaled_data
        (
            idx_col integer,
            petal_width float,
            petal_length float
        );
            """
        )

    op1

我想对此进行测试并尝试制作一张桌子。但是当我触发 DAG 时,我在日志中收到以下错误:

[2020-10-29 08:26:53,156] {{taskinstance.py:1128}} ERROR - could not connect to server: Connection refused
    Is the server running on host "pipeline_5_db_1" (172.22.0.2) and accepting
    TCP/IP connections on port 5439?

我已经搜索过,这似乎是一个常见错误,但我不确定它的含义或在我的情况下如何解决它。我尝试将主机设置为0.0.0.0 和其他一些小调整,但均未成功。

【问题讨论】:

  • 您在问题中写道容器名为pipeline_5_postgres_1,但在您的屏幕截图中,数据库主机设置为pipeline_5_db_1 - 在另一个PG容器上,您将端口映射到5432,但是在截图中它被设置为默认的5439
  • 嗨@mikezter,好消息-我本来打算写pipeline_5_db_1。但是pipeline_5_postgres_1 是由气流用于 dag 的 postgres 容器制成的。至于端口映射,默认的 postgres 端口是 5432,所以在 docker-compose 文件中,我使用"5439:5432" 将其从 5432 映射到 5439。这就是我写 5439 的原因。据我了解,语法是 "map_to:map_from"...

标签: docker airflow


【解决方案1】:

在这种情况下,您需要使用服务的名称作为主机,因此在创建连接时将主机设置为db 而不是pipeline_5_db_1

希望答案没有来得太晚:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2021-06-15
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2023-02-19
    相关资源
    最近更新 更多