docker 容器尽管是从 docker-compose 创建的,但彼此看不到
docker containers not seeing each other despite created from docker-compose
我 运行 在本地主机中使用 Airflow 2.1.2:
docker-撰写
version: '3'
services:
webserver:
build:
context: .
dockerfile: Dockerfile-python3
image: analytics-airflow
env_file:
- ./environtment_config/airflow_config/airflow.env
container_name: analytics-container-3
volumes:
- ./database_utils:/database_utils
- ./maintenance:/maintenance
- ./utils:/utils
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./datawarehouse:/datawarehouse
ports:
- "8080:8080"
command: webserver
scheduler:
container_name: analytics-scheduler
build:
context: .
dockerfile: Dockerfile-python3
env_file:
- ./environtment_config/airflow_config/airflow.env
volumes:
- ./database_utils:/database_utils
- ./maintenance:/maintenance
- ./utils:/utils
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./datawarehouse:/datawarehouse
ports:
- "8793:8793"
command: scheduler
Docker 文件
FROM apache/airflow:2.1.2-python3.8
ENV PYTHONPATH "${PYTHONPATH}:/"
RUN pip install -r environtment_config/docker_src/requirements.pip
Airflow.env
#Execution behaviour variables
_AIRFLOW_WWW_USER_CREATE=True
_AIRFLOW_WWW_USER_USERNAME=admin
_AIRFLOW_WWW_USER_PASSWORD=admin
_AIRFLOW_DB_UPGRADE=true
#Building variables
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'
AIRFLOW__CORE__LOAD_EXAMPLES: 'true'
AIRFLOW__API__AUTH_BACKEND: 'airflow.api.auth.backend.basic_auth'
AIRFLOW__CORE__SQL_ALCHEMY_CONN= sqlite:////opt/airflow/airflow.db
AIRFLOW__CORE__EXECUTOR=SequentialExecutor
AIRFLOW__WEBSERVER__SECRET_KEY=localhost
AIRFLOW__CORE__FERNET_KEY=
AIRFLOW__LOGGING__REMOTE_LOGGING= False
AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER=
UI 表明调度程序不是 运行ning:
如果我运行docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d509c71c804 airflow2 "/usr/bin/dumb-init …" 42 minutes ago Up 42 minutes (healthy) 8080/tcp scheduler
f1a945f1df01 airflow2 "/usr/bin/dumb-init …" About an hour ago Up About an hour (healthy) 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp container-3
我通过以下方式修复了连接到网络服务器容器的问题:
docker exec -it container-3 bash
airflow scheduler
所以解决方法是 运行 在同一个容器中提供两种服务,但我不明白为什么它不适用于两个不同的容器,因为它们都是用 docker-compose
创建的,他们应该看到彼此。
另外,每个服务实现一个容器也很重要,因为我将能够提高多个调度程序容器并使用 HA Scheduler,并扩展服务器。
此外,如果单个容器日志中的两个服务 运行 将混合在一起,因此如果其中一个服务发生问题将很难调试。
知道如何解决吗?或者为什么会这样?
你的问题不是调度器没有直接与网络服务器通信,而是你使用了sqlite和Sequential executor。基本上每个容器都有一个单独的 sqlite 数据库,调度程序和网络服务器实际上通过数据库进行通信。
您看到的警告是其结果。
在 Airflow 2.1.3 中,您会在 UI 中看到有关使用 SQLite 和顺序执行程序的额外警告(尽管您已经在日志中看到了有关警告)。
如果你想使用 Airflow 来处理任何真正重要的事情,包括单独的容器和 运行 快速(并行处理任务),你应该至少使用 Postgres 或 MySQL 数据库和 LocalExecutor。然后你就不会看到警告,Airflow 会工作得更快(基本上一切都应该开始并行工作)。
如果您想了解如何使用 DockerCompose 来获得一些灵感(包括当所有内容都分离到每个服务的单独容器中时它是如何工作的),您可以查看我们的快速入门:https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html (但这也仅用于开发 - 虽然它使用 CeleryExecutor,所以如果你想将它用于更重要的事情 quick-start/take 看看 Airflow,那么你必须基于它制作你自己的 DockerCompose)。 =12=]
对于任何真正严肃的事情 - 我建议改为 https://airflow.apache.org/docs/helm-chart/stable/index.html。
我 运行 在本地主机中使用 Airflow 2.1.2:
docker-撰写
version: '3'
services:
webserver:
build:
context: .
dockerfile: Dockerfile-python3
image: analytics-airflow
env_file:
- ./environtment_config/airflow_config/airflow.env
container_name: analytics-container-3
volumes:
- ./database_utils:/database_utils
- ./maintenance:/maintenance
- ./utils:/utils
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./datawarehouse:/datawarehouse
ports:
- "8080:8080"
command: webserver
scheduler:
container_name: analytics-scheduler
build:
context: .
dockerfile: Dockerfile-python3
env_file:
- ./environtment_config/airflow_config/airflow.env
volumes:
- ./database_utils:/database_utils
- ./maintenance:/maintenance
- ./utils:/utils
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./datawarehouse:/datawarehouse
ports:
- "8793:8793"
command: scheduler
Docker 文件
FROM apache/airflow:2.1.2-python3.8
ENV PYTHONPATH "${PYTHONPATH}:/"
RUN pip install -r environtment_config/docker_src/requirements.pip
Airflow.env
#Execution behaviour variables
_AIRFLOW_WWW_USER_CREATE=True
_AIRFLOW_WWW_USER_USERNAME=admin
_AIRFLOW_WWW_USER_PASSWORD=admin
_AIRFLOW_DB_UPGRADE=true
#Building variables
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'
AIRFLOW__CORE__LOAD_EXAMPLES: 'true'
AIRFLOW__API__AUTH_BACKEND: 'airflow.api.auth.backend.basic_auth'
AIRFLOW__CORE__SQL_ALCHEMY_CONN= sqlite:////opt/airflow/airflow.db
AIRFLOW__CORE__EXECUTOR=SequentialExecutor
AIRFLOW__WEBSERVER__SECRET_KEY=localhost
AIRFLOW__CORE__FERNET_KEY=
AIRFLOW__LOGGING__REMOTE_LOGGING= False
AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER=
UI 表明调度程序不是 运行ning:
如果我运行docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d509c71c804 airflow2 "/usr/bin/dumb-init …" 42 minutes ago Up 42 minutes (healthy) 8080/tcp scheduler
f1a945f1df01 airflow2 "/usr/bin/dumb-init …" About an hour ago Up About an hour (healthy) 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp container-3
我通过以下方式修复了连接到网络服务器容器的问题:
docker exec -it container-3 bash
airflow scheduler
所以解决方法是 运行 在同一个容器中提供两种服务,但我不明白为什么它不适用于两个不同的容器,因为它们都是用 docker-compose
创建的,他们应该看到彼此。
另外,每个服务实现一个容器也很重要,因为我将能够提高多个调度程序容器并使用 HA Scheduler,并扩展服务器。
此外,如果单个容器日志中的两个服务 运行 将混合在一起,因此如果其中一个服务发生问题将很难调试。
知道如何解决吗?或者为什么会这样?
你的问题不是调度器没有直接与网络服务器通信,而是你使用了sqlite和Sequential executor。基本上每个容器都有一个单独的 sqlite 数据库,调度程序和网络服务器实际上通过数据库进行通信。
您看到的警告是其结果。
在 Airflow 2.1.3 中,您会在 UI 中看到有关使用 SQLite 和顺序执行程序的额外警告(尽管您已经在日志中看到了有关警告)。
如果你想使用 Airflow 来处理任何真正重要的事情,包括单独的容器和 运行 快速(并行处理任务),你应该至少使用 Postgres 或 MySQL 数据库和 LocalExecutor。然后你就不会看到警告,Airflow 会工作得更快(基本上一切都应该开始并行工作)。
如果您想了解如何使用 DockerCompose 来获得一些灵感(包括当所有内容都分离到每个服务的单独容器中时它是如何工作的),您可以查看我们的快速入门:https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html (但这也仅用于开发 - 虽然它使用 CeleryExecutor,所以如果你想将它用于更重要的事情 quick-start/take 看看 Airflow,那么你必须基于它制作你自己的 DockerCompose)。 =12=]
对于任何真正严肃的事情 - 我建议改为 https://airflow.apache.org/docs/helm-chart/stable/index.html。