无法使用docker连接到airflow中的postgres数据库

fff*_*ost 5 docker airflow

我\xe2\x80\x99m 尝试使用Airflow 连接到PostgreSQL 数据库,但我\xe2\x80\x99m 遇到了一个我可以\xe2\x80\x99t 似乎能解决的问题。对于 tl;dr,我的帖子底部包含我在尝试在气流 dag 中创建 postgres 表时遇到的错误。

\n

docker-compose我\xe2\x80\x99m与puckel 图像一起使用,但我\xe2\x80\x99ve 扩展了它以供我使用,因此这l/custom_airflow:1.5只是我调整后的图像以包含一些 python 依赖项 \xe2\x80\x93 它只是抓取 puckel image 和 pip 安装我自己的 deps。这是我的docker-compose文件:

\n
version: \'3.7\'\nservices:\n    postgres:\n        image: postgres:9.6\n        environment:\n            - POSTGRES_USER=airflow\n            - POSTGRES_PASSWORD=airflow\n            - POSTGRES_DB=airflow\n        logging:\n            options:\n                max-size: 10m\n                max-file: "3"\n\n    db:\n        image: postgres:13.0-alpine\n        restart: always\n        environment:\n            POSTGRES_DB: postgres\n            POSTGRES_USER: admin_user\n            POSTGRES_PASSWORD: secret_password\n            POSTGRES_HOST_AUTH_METHOD: trust\n            # PGDATA: /var/lib/postgresql/data\n        volumes:\n            - db-data:/var/lib/postgresql/data\n        ports:\n            - "5439:5432"\n         \n    pgadmin:\n        image: dpage/pgadmin4:4.27\n        restart: always\n        environment:\n            PGADMIN_DEFAULT_EMAIL: admin@test.com\n            PGADMIN_DEFAULT_PASSWORD: test\n            PGADMIN_LISTEN_PORT: 1111\n        ports:\n        - "1111:1111"\n        volumes:\n            - pgadmin-data:/var/lib/pgadmin\n        links:\n            - "db:pgsql-server"\n\n    webserver:\n        image: l/custom_airflow:1.5\n        container_name: l_custom_airflow\n        restart: always\n        depends_on:\n            - postgres\n        environment:\n            - LOAD_EX=n\n            - EXECUTOR=Local\n        logging:\n            options:\n                max-size: 10m\n                max-file: "3"\n        volumes:\n            - ./dags:/usr/local/airflow/dags\n            - ./db-data:/usr/local/airflow/db-data\n            - ./pgadmin-data:/usr/local/airflow/pgadmin-data\n        ports:\n            - "8080:8080"\n        command: webserver\n        healthcheck:\n            test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]\n            interval: 30s\n            timeout: 30s\n            retries: 3\n\nvolumes:\n    db-data: \n    pgadmin-data:\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

在此输入图像描述

\n

然后我就有了简单的达格:

\n
from airflow.models import DAG\nfrom airflow.utils.dates import days_ago\nfrom airflow.operators.python_operator import PythonOperator\nfrom airflow.operators.postgres_operator import PostgresOperator\n\nargs = {\'start_date\': days_ago(1)}\n\ndag = DAG(\n    dag_id=\'testing_dag\',\n    default_args=args, \n    schedule_interval=None\n    )\n\n\nwith dag:\n\n    op1 = PostgresOperator(\n        task_id = "make_a_staging_table",\n        postgres_conn_id = "my_pg_connection",\n        sql = """CREATE TABLE scaled_data\n        (\n            idx_col integer,\n            petal_width float,\n            petal_length float\n        );\n            """\n        )\n\n    op1\n
Run Code Online (Sandbox Code Playgroud)\n

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

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

我已经搜索过,这似乎是一个常见错误,但我\xe2\x80\x99m 不确定这意味着什么或如何在我的情况下解决它。我尝试过设置主机0.0.0.0和其他细微调整,但没有成功。

\n

小智 3

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

我希望答案没有来得这么晚:)