Using Airflow on Windows

5 min read

From version 2.3, Airflow (opens in a new tab) has been available in Apple Silicon.

Unfortunately, using Airflow in Windows operating systems is a different matter as it doesn't natively support the Microsoft's operating system.

However, it is not entirely true, as I learned that Airflow can be used with the Docker (opens in a new tab). In a word, with Docker WSL 2 installed (by default), Windows users can use the nix-based commands easily. In other words, Airflow commands can be used in Windows as well.

Below, assuming that you already installed Docker, I will just show deploy Airflow with Docker and an example of Airflow CLIs.

Deploying Airflow with Docker

Get Ready

According to offical Airflow website (opens in a new tab), you can deploy using curl command as below.

curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.4.3/docker-compose.yaml'

However, in Windows, unfortunately, that command didn't work for me. And since curl command is downloading a file, you can simply copy the content of the yaml file to create one in Docker local directory (C:\Users{user_name}.docker) with filename docker-compose.yaml.

Also, just in case it doesn't work, it is advised to create a file named .env with adding the following line.

AIRFLOW_UID=50000

Now, you can deploy the Airflow as below.

Initializing Airflow

docker-compose up airflow-init

Simple, heh?

Running Airflow (Webserver)

docker-compose up

First, let's if the process is running.

(works) C:\Users\minpark\.docker>docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED        STATUS                            PORTS                    NAMES
7f54c4de8703   apache/airflow:2.4.3   "/usr/bin/dumb-init …"   31 hours ago   Up 2 seconds (health: starting)   8080/tcp                 docker-airflow-worker-1
dde3a7124f42   apache/airflow:2.4.3   "/usr/bin/dumb-init …"   31 hours ago   Up 27 seconds (healthy)           8080/tcp                 docker-airflow-scheduler-1
36103c149a6d   apache/airflow:2.4.3   "/usr/bin/dumb-init …"   31 hours ago   Up 27 seconds (healthy)           8080/tcp                 docker-airflow-triggerer-1
d9d8ddb4fd60   apache/airflow:2.4.3   "/usr/bin/dumb-init …"   31 hours ago   Up 27 seconds (healthy)           0.0.0.0:8080->8080/tcp   docker-airflow-webserver-1
3db3f96e4dc9   redis:latest           "docker-entrypoint.s…"   31 hours ago   Up 27 seconds (healthy)           6379/tcp                 docker-redis-1
150e86e38855   postgres:13            "docker-entrypoint.s…"   31 hours ago   Up 28 seconds (healthy)           5432/tcp                 docker-postgres-1

Looks good, with this, you can now access Airflow Admin GUI with https://localhost:8080 (opens in a new tab).

Airflow CLIs (dags list)

Although you can access Admin GUI with the previous command, executing Airflow CLI commands is a little bit different. Unlike installing Airflow locally, you cannot just run airflow dags list as Airflow runs under Docker.

To see a list of dags, you run the following command using the same Docker command.

docker-compose run airflow-worker airflow dags list

As you might have noticed, for the similar Airflow CLI commands, you need airflow-worker here.

Below, as you can see, we can use Airflow CLIs in Windows!

(works) C:\Users\minpark\.docker>docker-compose run airflow-worker airflow dags list
[+] Running 3/0
 - Container docker-redis-1         Running                                                                        0.0s
 - Container docker-postgres-1      Running                                                                        0.0s
 - Container docker-airflow-init-1  Created                                                                        0.0s
[+] Running 3/3
 - Container docker-redis-1         Healthy                                                                        0.5s
 - Container docker-postgres-1      Healthy                                                                        0.5s
 - Container docker-airflow-init-1  Started                                                                        1.2s
 
/home/airflow/.local/lib/python3.7/site-packages/airflow/configuration.py:367: FutureWarning: The auth_backends setting in [api] has had airflow.api.auth.backend.session added in the running config, which is needed by the UI. Please update your config before Apache Airflow 3.0.
  FutureWarning,
dag_id                                   | filepath                                                   | owner   | paused
=========================================+============================================================+=========+=======
dataset_consumes_1                       | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_datasets.py                            |         |
dataset_consumes_1_and_2                 | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_datasets.py                            |         |
dataset_consumes_1_never_scheduled       | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_datasets.py                            |         |
dataset_consumes_unknown_never_scheduled | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_datasets.py                            |         |
dataset_produces_1                       | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_datasets.py                            |         |
dataset_produces_2                       | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_datasets.py                            |         |
demo                                     | demo.py                                                    | airflow | True
example_bash_operator                    | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_bash_operator.py                       |         |
example_branch_datetime_operator         | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_branch_datetime_operator.py            |         |
example_branch_datetime_operator_2       | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_branch_datetime_operator.py            |         |
example_branch_datetime_operator_3       | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_branch_datetime_operator.py            |         |
example_branch_dop_operator_v3           | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_branch_python_dop_operator_3.py        |         |
example_branch_labels                    | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_branch_labels.py                       |         |
example_branch_operator                  | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_branch_operator.py                     |         |
example_branch_python_operator_decorator | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_branch_operator_decorator.py           |         |
example_complex                          | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_complex.py                             |         |
example_dag_decorator                    | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_dag_decorator.py                       |         |
example_external_task_marker_child       | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_external_task_marker_dag.py            |         |
example_external_task_marker_parent      | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_external_task_marker_dag.py            |         |
example_kubernetes_executor              | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_kubernetes_executor.py                 |         |
example_local_kubernetes_executor        | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_local_kubernetes_executor.py           |         |
example_nested_branch_dag                | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_nested_branch_dag.py                   |         |
example_passing_params_via_test_command  | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_passing_params_via_test_command.py     |         |
example_python_operator                  | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_python_operator.py                     |         |
example_short_circuit_decorator          | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_short_circuit_decorator.py             |         |
example_short_circuit_operator           | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_short_circuit_operator.py              |         |
example_skip_dag                         | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_skip_dag.py                            |         |
example_sla_dag                          | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_sla_dag.py                             |         |
example_subdag_operator                  | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_subdag_operator.py                     |         |
example_subdag_operator.section-1        | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_subdag_operator.py                     |         |
example_subdag_operator.section-2        | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_subdag_operator.py                     |         |
example_task_group                       | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_task_group.py                          |         |
example_task_group_decorator             | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_task_group_decorator.py                |         |
example_time_delta_sensor_async          | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_time_delta_sensor_async.py             |         |
example_trigger_controller_dag           | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_trigger_controller_dag.py              |         |
example_trigger_target_dag               | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_trigger_target_dag.py                  |         |
example_weekday_branch_operator          | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_branch_day_of_week_operator.py         |         |
example_xcom                             | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_xcom.py                                |         |
example_xcom_args                        | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_xcomargs.py                            |         |
example_xcom_args_with_operators         | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_xcomargs.py                            |         |
latest_only                              | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_latest_only.py                         |         |
latest_only_with_trigger                 | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/example_latest_only_with_trigger.py            |         |
tutorial                                 | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/tutorial.py                                    |         |
tutorial_dag                             | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/tutorial_dag.py                                |         |
tutorial_taskflow_api                    | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/tutorial_taskflow_api.py                       |         |
tutorial_taskflow_api_virtualenv         | /home/airflow/.local/lib/python3.7/site-packages/airflow/e | airflow | True
                                         | xample_dags/tutorial_taskflow_api_virtualenv.py            |         |
CC BY-NC 4.0 © min park.RSS