气流:如何从docker映像一起运行Web服务器和调度程序?
我对Docker和Airflow都缺乏经验,所以这可能是一个愚蠢的问题。我有一个Dockerfile,它使用了气流:如何从docker映像一起运行Web服务器和调度程序?,docker,airflow,Docker,Airflow,我对Docker和Airflow都缺乏经验,所以这可能是一个愚蠢的问题。我有一个Dockerfile,它使用了apache/airflow图像和我自己的一些DAG。我想和调度器一起启动airflow web服务器,但我遇到了问题。我可以让它工作,但我觉得我处理这个错误 下面是我的Dockerfile的外观: FROM apache/airflow COPY airflow/dags/ /opt/airflow/dags/ RUN airflow initdb 然后我运行docker build
apache/airflow
图像和我自己的一些DAG。我想和调度器一起启动airflow web服务器,但我遇到了问题。我可以让它工作,但我觉得我处理这个错误
下面是我的Dockerfile的外观:
FROM apache/airflow
COPY airflow/dags/ /opt/airflow/dags/
RUN airflow initdb
然后我运行docker build-t learning/aiffort.
。这里是困难的部分:然后我运行docker运行--rm-tp 8080:8080学习/气流:最新的Web服务器
,并在一个单独的终端上运行docker exec`docker ps-q`airflow scheduler
。问题是,在实践中,这通常发生在某个VM上,因此打开第二个终端不是一个选项,多台机器可能无法访问同一个docker容器。运行webserver&&scheduler
似乎不起作用,服务器似乎正在阻塞,我仍然在用户界面中看到消息“调度器似乎没有运行”
关于运行服务器和调度器的正确方式有什么想法吗
非常感谢 单独旋转两个docker容器可能无法实现您的目标,因为您需要容器之间的通信。您可以手动设置容器之间的连接,尽管我个人还没有尝试过这种方法 更简单的方法是使用
docker compose
,您可以在yml文件中定义资源,并让docker compose为您创建资源
版本:“2.1”
服务:
网络服务器:
图:puckel/docker气流:1.10.4
重新启动:始终
...
调度程序:
图:puckel/docker气流:1.10.4
重新启动:始终
取决于:
-网络服务器
...
您可以找到完整的文件。注意:您的问题适用于任何流程,而不仅仅是流程 当然,不建议这样做,但您可以在
supervisor
上找到Docker文档,它在单个supervisord
守护进程下监视和运行多个进程
首先,感谢@Alex和@abestrad建议docker在这里创作——我认为这是最好的解决方案。我最终通过引用使它工作起来。因此,我的解决方案如下: 首先,我的Dockerfile现在看起来像这样:
FROM apache/airflow
RUN pip install --upgrade pip
RUN pip install --user psycopg2-binary
COPY airflow/airflow.cfg /opt/airflow/
请注意,我不再将DAG复制到VM,此信息将通过卷传递。然后,我通过docker build-t learning/afflow构建docker文件。
。我的docker compose.yaml
如下所示:
version: "3"
services:
postgres:
image: "postgres:9.6"
container_name: "postgres"
environment:
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
ports:
- "5432:5432"
volumes:
- ./data/postgres:/var/lib/postgresql/data
initdb:
image: learning/airflow
entrypoint: airflow initdb
depends_on:
- postgres
webserver:
image: learning/airflow
restart: always
entrypoint: airflow webserver
healthcheck:
test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
ports:
- "8080:8080"
depends_on:
- postgres
volumes:
- ./airflow/dags:/opt/airflow/dags
- ./airflow/plugins:/opt/airflow/plugins
- ./data/logs:/opt/airflow/logs
scheduler:
image: learning/airflow
restart: always
entrypoint: airflow scheduler
healthcheck:
test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-scheduler.pid ]"]
interval: 30s
timeout: 30s
retries: 3
depends_on:
- postgres
volumes:
- ./airflow/dags:/opt/airflow/dags
- ./airflow/plugins:/opt/airflow/plugins
- ./data/logs:/opt/airflow/logs
要使用它,首先运行
docker compose up postgres
,然后运行docker compose up initdb
,然后运行docker compose up webserver scheduler
。就这样 你有没有试着用docker compose来实现这两个功能?当然,这或者Kubernetes集群都是有效的选择,我只是想一定有一个更简单的方法。也许我错了。Compose比k8sWell简单得多,这将运行两个相同的容器great,谢谢,这绝对是我想要的。这种方法有两个问题:首先,如果我在docker compose文件中构建图像,像这样builder:\n build:\n image:learning/aiffair
,运行docker compose up会抛出一个错误aiffair子命令error:“aiffair”
,换句话说,它不只是构建映像,而是尝试运行它。第二个问题是,即使我预先构建了映像,访问localhost:8080也会显示airflow UI,但那里没有DAG,并且它表示调度程序没有运行,尽管我可以在日志中看到它正在运行is@IVR它将尝试运行容器的ENTRYPOINT
+CMD
,是的,感谢您指出这一点,但是我认为docker compose解决方案在这里更干净。一个建议是:通过运行运行pip安装来减少图像层--升级pip&&pip安装--用户psycopg2 binary
@IVR谢谢分享。你提到的这篇文章和许多其他文章一样,现在没有更新为使用你在这里使用的官方docker图像。你能分享一下你先做的任何预处理吗,比如先创建airflow.cfg,或者其他你没有提到的事情吗?@NivCohen,嘿,我很乐意,但说实话,我已经做了很久了,所以我恐怕已经记不起来了。从我的记忆中,当我知道如何运行docker compose后,这并不难。祝你好运