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)")
我不太确定此时缺少什么。
非常感谢任何帮助!
谢谢
两个问题。
你应该在你的连接字符串中使用 mysql_local 作为主机名而不是 mock_mysql 因为这是你的 MySQL 容器的名称(和 this.is docker-compose)
在 DNS 中定义的名称
您使用的 healthecheck 假定无密码身份验证,并且可能在 MySQL 的默认数据库映像中 is.disabled 以确保安全。您应该将 user/password as.parameters 传递给您的 healthecheck 命令或启用 root 无密码身份验证
这里是气流和 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)")
我不太确定此时缺少什么。 非常感谢任何帮助! 谢谢
两个问题。
你应该在你的连接字符串中使用 mysql_local 作为主机名而不是 mock_mysql 因为这是你的 MySQL 容器的名称(和 this.is docker-compose)
在 DNS 中定义的名称您使用的 healthecheck 假定无密码身份验证,并且可能在 MySQL 的默认数据库映像中 is.disabled 以确保安全。您应该将 user/password as.parameters 传递给您的 healthecheck 命令或启用 root 无密码身份验证