Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
气流:如何从docker映像一起运行Web服务器和调度程序?_Docker_Airflow - Fatal编程技术网

气流:如何从docker映像一起运行Web服务器和调度程序?

气流:如何从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

我对Docker和Airflow都缺乏经验,所以这可能是一个愚蠢的问题。我有一个Dockerfile,它使用了
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后,这并不难。祝你好运