首页 > 解决方案 > docker compose 中的 Airflow + MySQL - 未知主机和访问被拒绝

问题描述

气流和mysql设置的新手在这里。我正在尝试以 MySQL 作为后端在 docker-compose 中设置气流。

我有我的 mySQL 连接字符串,sql_alchemy_conn_cmd=mysql://localuser:localpassword@mock_mysql/metastoreairflow.cfg

我有我docker-compose.yml

version: "3.9"
networks:
  airflow:
services:
  redis_local:
    image: redis:latest
    container_name: redis_server
    ports:
      - 6379:6379
    command: redis-server
    restart: on-failure
    networks:
      - airflow
  mysql_local:
    image: mysql:5.7
    container_name: mysql_local
    environment:
      - MYSQL_ROOT_HOST=%
      - MYSQL_USER=localuser
      - MYSQL_PASSWORD=localpassword
      - MYSQL_ROOT_PASSWORD=localpassword
      - MYSQL_DATABASE=metastore
    volumes:
      - ./script/init.sql:/data/application/init.sql
      - ./dbdata:/var/lib/mysql
    ports:
      - 3306:3306
    restart: on-failure
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 1s
      retries: 10
    command:
      --init-file /data/application/init.sql
      --explicit_defaults_for_timestamp=1
    networks:
      - airflow
  airflow_init_db:
    depends_on:
      - redis_local
      - mysql_local
    container_name: airflow_init_db
    image: apache/airflow:2.0.0-python3.8
    command: airflow initdb

由于它连接到metastore数据库,因此需要在数据库启动时在 mysql 中设置数据库。我有我的 init.sql 作为

CREATE DATABASE IF NOT EXISTS metastore;
CREATE USER 'localuser'@'localhost' IDENTIFIED BY 'localpassword';
GRANT ALL PRIVILEGES ON metastore . * TO 'localuser'@'localhost';
FLUSH PRIVILEGES;

然而,从健康检查来看,mysql 本身失败了

mysql_local        | 2021-07-06T04:29:04.011037Z 3 [Note] Access denied for user 'root'@'localhost' (using password: NO)

初始化数据库和调度程序都失败了

sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2005, "Unknown MySQL server host 'mock_mysql' (-2)")

我不确定此时缺少什么。非常感谢任何帮助!谢谢

标签: mysqldocker-composeairflow

解决方案


两个问题。

  1. 您应该在连接字符串中使用 mysql_local 作为主机名,而不是 mock_mysql,因为这是您的 MySQL 容器的名称(并且 this.is 由 docker-compose 在 DNS 中定义的名称)

  2. 您使用的 healthecheck 假定无密码身份验证,并且可能在 MySQL 的默认 db 映像中它是.disabled 以确保安全。您应该将用户/密码 as.parameters 传递给您的 healthecheck 命令或启用 root 无密码身份验证


推荐阅读