Airflow + MySQL in docker compose - 未知主机和访问被拒绝

Airflow + MySQL in docker compose - Unknown host and Access denied

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

我的 mySQL 连接字符串在 airflow.cfg

中为 sql_alchemy_conn_cmd=mysql://localuser:localpassword@mock_mysql/metastore

我有我的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)

init db 和调度程序都失败了

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

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

两个问题。

  1. 你应该在你的连接字符串中使用 mysql_local 作为主机名而不是 mock_mysql 因为这是你的 MySQL 容器的名称(和 this.is docker-compose)

    在 DNS 中定义的名称
  2. 您使用的 healthecheck 假定无密码身份验证,并且可能在 MySQL 的默认数据库映像中 is.disabled 以确保安全。您应该将 user/password as.parameters 传递给您的 healthecheck 命令或启用 root 无密码身份验证