<h3 dir="auto">Apache Airflow version</h3>
<p dir="auto">2.3.3 (latest released)</p>
<h3 dir="auto">What happened</h3>
<p dir="auto">Our schedulers have crashed on two occasions after upgrading to Airflow 2.3.3. The same DAG is responsible each time, but this is likely due to the fact that it is the only dynamic task mapping DAG running right now (catching up some historical data). This DAG uses the same imported <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/task/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/task">@task</a> function that many other DAGs used successfully with no errors. The issue has only occurred after upgrading to Airflow 2.3.3</p>
<h3 dir="auto">What you think should happen instead</h3>
<p dir="auto">This error should not be raised - there should be no record of this task instance because, according to the UI, the task has not run yet. The extract task is green but the transform task which raised the error is blank. The DAG run is stuck in the running state until eventually the scheduler dies and the Airflow banner notifies me that there is no scheduler heartbeat.</p>
<p dir="auto">Also, this same DAG (and other which use the same imported external <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/task/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/task">@task</a> function) ran for hours before the upgrade to Airflow 2.3.3.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="[2022-07-13 22:49:55,880] {process_utils.py:75} INFO - Process psutil.Process(pid=143, status='terminated', started='22:49:52') (143) terminated with exit code None
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py&quot;, line 476, in checkout
[SQL: UPDATE task_instance SET map_index=%(map_index)s WHERE task_instance.task_id = %(task_instance_task_id)s AND task_instance.dag_id = %(task_instance_dag_id)s AND task_instance.run_id = %(task_instance_run_id)s AND task_instance.map_index = %(task_instance_map_index)s]
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py&quot;, line 476, in checkout
    compat.raise_(
[2022-07-13 22:50:23,909] {scheduler_job.py:780} INFO - Exited execute loop
[parameters: {'map_index': 0, 'task_instance_task_id': 'transform', 'task_instance_dag_id': 'dag-id', 'task_instance_run_id': 'scheduled__2022-06-04T14:05:00+00:00', 'task_instance_map_index': -1}]
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/create.py&quot;, line 590, in connect
    rec = pool._do_get()
    rec = pool._do_get()

  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py&quot;, line 145, in _do_get
    return dialect.connect(*cargs, **cparams)
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py&quot;, line 145, in _do_get
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/util/compat.py&quot;, line 207, in raise_
(Background on this error at: https://sqlalche.me/e/14/gkpj)
[parameters: {'map_index': 0, 'task_instance_task_id': 'transform', 'task_instance_dag_id': 'dag_id, 'task_instance_run_id': 'scheduled__2022-06-04T14:05:00+00:00', 'task_instance_map_index': -1}]
[SQL: UPDATE task_instance SET map_index=%(map_index)s WHERE task_instance.task_id = %(task_instance_task_id)s AND task_instance.dag_id = %(task_instance_dag_id)s AND task_instance.run_id = %(task_instance_run_id)s AND task_instance.map_index = %(task_instance_map_index)s]
[2022-07-13 22:49:25,323] {scheduler_job.py:780} INFO - Exited execute loop
    raise exception
[2022-07-13 22:49:56,001] {process_utils.py:240} INFO - Waiting up to 5 seconds for processes to exit...
[2022-07-13 22:49:56,014] {process_utils.py:75} INFO - Process psutil.Process(pid=144, status='terminated', started='22:49:52') (144) terminated with exit code None
    compat.raise_(
Traceback (most recent call last):
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py&quot;, line 1802, in _execute_context
[2022-07-13 22:49:56,016] {process_utils.py:75} INFO - Process psutil.Process(pid=140, status='terminated', exitcode=0, started='22:49:51') (140) terminated with exit code 0
    self.dialect.do_execute(
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py&quot;, line 1802, in _execute_context
[2022-07-13 22:49:56,018] {scheduler_job.py:780} INFO - Exited execute loop
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/default.py&quot;, line 719, in do_execute
    self.dialect.do_execute(
Traceback (most recent call last):
    cursor.execute(statement, parameters)
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/default.py&quot;, line 719, in do_execute
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py&quot;, line 1802, in _execute_context
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint &quot;task_instance_pkey&quot;
    cursor.execute(statement, parameters)
    self.dialect.do_execute(
DETAIL:  Key (dag_id, task_id, run_id, map_index)=(oportun-five9-calls-ccvcc-v1, transform, scheduled__2022-06-04T14:05:00+00:00, 0) already exists.
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint &quot;task_instance_pkey&quot;
  File &quot;/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/default.py&quot;, line 719, in do_execute
"><pre class="notranslate"><code class="notranslate">[2022-07-13 22:49:55,880] {process_utils.py:75} INFO - Process psutil.Process(pid=143, status='terminated', started='22:49:52') (143) terminated with exit code None
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 476, in checkout
[SQL: UPDATE task_instance SET map_index=%(map_index)s WHERE task_instance.task_id = %(task_instance_task_id)s AND task_instance.dag_id = %(task_instance_dag_id)s AND task_instance.run_id = %(task_instance_run_id)s AND task_instance.map_index = %(task_instance_map_index)s]
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 476, in checkout
    compat.raise_(
[2022-07-13 22:50:23,909] {scheduler_job.py:780} INFO - Exited execute loop
[parameters: {'map_index': 0, 'task_instance_task_id': 'transform', 'task_instance_dag_id': 'dag-id', 'task_instance_run_id': 'scheduled__2022-06-04T14:05:00+00:00', 'task_instance_map_index': -1}]
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 590, in connect
    rec = pool._do_get()
    rec = pool._do_get()

  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 145, in _do_get
    return dialect.connect(*cargs, **cparams)
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 145, in _do_get
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
(Background on this error at: https://sqlalche.me/e/14/gkpj)
[parameters: {'map_index': 0, 'task_instance_task_id': 'transform', 'task_instance_dag_id': 'dag_id, 'task_instance_run_id': 'scheduled__2022-06-04T14:05:00+00:00', 'task_instance_map_index': -1}]
[SQL: UPDATE task_instance SET map_index=%(map_index)s WHERE task_instance.task_id = %(task_instance_task_id)s AND task_instance.dag_id = %(task_instance_dag_id)s AND task_instance.run_id = %(task_instance_run_id)s AND task_instance.map_index = %(task_instance_map_index)s]
[2022-07-13 22:49:25,323] {scheduler_job.py:780} INFO - Exited execute loop
    raise exception
[2022-07-13 22:49:56,001] {process_utils.py:240} INFO - Waiting up to 5 seconds for processes to exit...
[2022-07-13 22:49:56,014] {process_utils.py:75} INFO - Process psutil.Process(pid=144, status='terminated', started='22:49:52') (144) terminated with exit code None
    compat.raise_(
Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1802, in _execute_context
[2022-07-13 22:49:56,016] {process_utils.py:75} INFO - Process psutil.Process(pid=140, status='terminated', exitcode=0, started='22:49:51') (140) terminated with exit code 0
    self.dialect.do_execute(
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1802, in _execute_context
[2022-07-13 22:49:56,018] {scheduler_job.py:780} INFO - Exited execute loop
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 719, in do_execute
    self.dialect.do_execute(
Traceback (most recent call last):
    cursor.execute(statement, parameters)
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 719, in do_execute
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1802, in _execute_context
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "task_instance_pkey"
    cursor.execute(statement, parameters)
    self.dialect.do_execute(
DETAIL:  Key (dag_id, task_id, run_id, map_index)=(oportun-five9-calls-ccvcc-v1, transform, scheduled__2022-06-04T14:05:00+00:00, 0) already exists.
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "task_instance_pkey"
  File "/home/airflow/.local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 719, in do_execute

</code></pre></div>
<h3 dir="auto">How to reproduce</h3>
<p dir="auto">Run a dynamic task mapping DAG in Airflow 2.3.3</p>
<h3 dir="auto">Operating System</h3>
<p dir="auto">Ubuntu 20.04</p>
<h3 dir="auto">Versions of Apache Airflow Providers</h3>
<p dir="auto">The 2.3.3 constraints file for Python 3.10 is used for the specific versions:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="apache-airflow-providers-celery
apache-airflow-providers-docker
apache-airflow-providers-ftp
apache-airflow-providers-http
apache-airflow-providers-microsoft-azure
apache-airflow-providers-mysql
apache-airflow-providers-postgres
apache-airflow-providers-odbc
apache-airflow-providers-redis
apache-airflow-providers-salesforce
apache-airflow-providers-sftp
apache-airflow-providers-ssh
apache-airflow-providers-google"><pre class="notranslate"><code class="notranslate">apache-airflow-providers-celery
apache-airflow-providers-docker
apache-airflow-providers-ftp
apache-airflow-providers-http
apache-airflow-providers-microsoft-azure
apache-airflow-providers-mysql
apache-airflow-providers-postgres
apache-airflow-providers-odbc
apache-airflow-providers-redis
apache-airflow-providers-salesforce
apache-airflow-providers-sftp
apache-airflow-providers-ssh
apache-airflow-providers-google
</code></pre></div>
<h3 dir="auto">Deployment</h3>
<p dir="auto">Other Docker-based deployment</p>
<h3 dir="auto">Deployment details</h3>
<p dir="auto">I am using two schedulers which run on separate nodes.</p>
<h3 dir="auto">Anything else</h3>
<p dir="auto">The DAG only allows 1 max active DAG run at a time. <code class="notranslate">catchup=True</code> is enabled and it has been running to fill in all tasks since 05/10 start_date.</p>
<p dir="auto">The extract() task returns a list of 1 or more files which have been saved on cloud storage.  The transform task processes each of these paths dynamically. I have used these same tasks (imported from another file) for over 15 different DAGs so far without issue. The problem only occurred yesterday sometime after updating Airflow to 2.3.3.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="def dag_name():
    retrieved = extract()
    transform = transform_files(retrieved)
    finalize = finalize_dataset(transform)
    consolidate = consolidate_staging(transform)

    retrieved &gt;&gt; transform &gt;&gt; finalize &gt;&gt; consolidate "><pre class="notranslate"><code class="notranslate">def dag_name():
    retrieved = extract()
    transform = transform_files(retrieved)
    finalize = finalize_dataset(transform)
    consolidate = consolidate_staging(transform)

    retrieved &gt;&gt; transform &gt;&gt; finalize &gt;&gt; consolidate 
</code></pre></div>
<p dir="auto">My <code class="notranslate">transform_files</code> task is just a function which expands the XCom Arg of the extract task and transforms each file. Nearly everything is based on DAG params which are customized in the DAG.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
transform_file_task = task(process_data)

def transform_files(source):
    return (
        transform_file_task.override(task_id=&quot;transform&quot;)
        .partial(
            destination=f&quot;{{{{ params.container }}}}/{{{{ dag.dag_id | dag_name }}}}/{{{{ ti.task_id }}}}&quot;,
            wasb_conn_id=&quot;{{ params.wasb_conn_id }}&quot;,
            pandas_options=&quot;{{ params.pandas_options}}&quot;,
            meta_columns=&quot;{{ params.meta_columns }}&quot;,
            script=&quot;{{ params.script }}&quot;,
            function_name=&quot;{{ params.function }}&quot;,
            schema_name=&quot;{{ params.schema }}&quot;,
            template=f&quot;{{{{ dag.dag_id | dag_version }}}}-{{{{ ti.run_id }}}}-{{{{ ti.map_index }}}}&quot;,
            existing_data_behavior=&quot;overwrite_or_ignore&quot;,
            partition_columns=&quot;{{ params.partition_columns }}&quot;,
            dag_name=&quot;{{ dag.dag_id | dag_name }}&quot;,
            failure_recipients=&quot;{{ params.recipients }}&quot;,
            success_recipients=&quot;{{ params.recipients }}&quot;,
        )
        .expand(source=source)
    )"><pre class="notranslate"><code class="notranslate">
transform_file_task = task(process_data)

def transform_files(source):
    return (
        transform_file_task.override(task_id="transform")
        .partial(
            destination=f"{{{{ params.container }}}}/{{{{ dag.dag_id | dag_name }}}}/{{{{ ti.task_id }}}}",
            wasb_conn_id="{{ params.wasb_conn_id }}",
            pandas_options="{{ params.pandas_options}}",
            meta_columns="{{ params.meta_columns }}",
            script="{{ params.script }}",
            function_name="{{ params.function }}",
            schema_name="{{ params.schema }}",
            template=f"{{{{ dag.dag_id | dag_version }}}}-{{{{ ti.run_id }}}}-{{{{ ti.map_index }}}}",
            existing_data_behavior="overwrite_or_ignore",
            partition_columns="{{ params.partition_columns }}",
            dag_name="{{ dag.dag_id | dag_name }}",
            failure_recipients="{{ params.recipients }}",
            success_recipients="{{ params.recipients }}",
        )
        .expand(source=source)
    )
</code></pre></div>
<p dir="auto">Deleting the DAG run which caused the error and restarting the Airflow scheduler fixes the issue temporarily. If I do not delete the DAG run then the scheduler will keep dying.</p>
<h3 dir="auto">Are you willing to submit PR?</h3>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> Yes I am willing to submit a PR!</li>
</ul>
<h3 dir="auto">Code of Conduct</h3>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I agree to follow this project's <a href="https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md">Code of Conduct</a></li>
</ul>
<p dir="auto"><strong>Description</strong></p>
<p dir="auto">In order to use the production image we are already working on a helm chart, but we might want to add a production-ready docker compose that will be able to run airflow  installation.</p>
<p dir="auto"><strong>Use case / motivation</strong></p>
<p dir="auto">For local tests/small deployments - being able to have such docker-compose environment would be really nice.</p>
<p dir="auto">We seem to get to <a href="https://apache-airflow.slack.com/archives/CCPRP7943/p1598320605061700" rel="nofollow">consensus</a> that we need to have several docker-compose "sets" of files:</p>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> Local Executor</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> Celery Executor</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> Kubernetes Executor (??? do we need to have a Kubernetes Executor in a Compose ? I guess not...)</li>
</ul>
<p dir="auto">They should be varianted and possible to specify the number of parameters:</p>
<ul dir="auto">
<li>Database (Postgres/MySQL)</li>
<li>Redis vs. Rabitmq (should we choose one ???)</li>
<li>Ports</li>
<li>Volumes (persistent / not)</li>
<li>Airflow Images</li>
<li>Fernet Key</li>
<li>RBAC</li>
</ul>
<p dir="auto">Depending on the setup, those Docker compose file should do proper DB initialisation.</p>
<hr>
<p dir="auto">Example Docker Compose (From <a href="https://apache-airflow.slack.com/archives/CQAMHKWSJ/p1587748008106000" rel="nofollow">https://apache-airflow.slack.com/archives/CQAMHKWSJ/p1587748008106000</a>) that we might use as a base and <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="606509422" data-permission-text="Title is private" data-url="https://github.com/apache/airflow/issues/8548" data-hovercard-type="issue" data-hovercard-url="/apache/airflow/issues/8548/hovercard" href="https://github.com/apache/airflow/issues/8548">#8548</a> . This is just example so this issue will not implement all of it and we will likely split those docker-compose into separate postgres/sqlite/mysql similarly as we do in CI script, so I wanted to keep it as separate issue - we will deal with user creation in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="608272731" data-permission-text="Title is private" data-url="https://github.com/apache/airflow/issues/8606" data-hovercard-type="issue" data-hovercard-url="/apache/airflow/issues/8606/hovercard" href="https://github.com/apache/airflow/issues/8606">#8606</a></p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="version: '3'
services:
  postgres:
    image: postgres:latest
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=airflow
      - POSTGRES_PORT=5432
    ports:
      - 5432:5432
  redis:
    image: redis:latest
    ports:
      - 6379:6379
  flower:
    image: apache/airflow:1.10.10
    volumes:
      - ./airflow-data/dags:/opt/airflow/dags
    environment:
      - AIRFLOW__CORE__EXECUTOR=CeleryExecutor
      - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
      - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=
      - AIRFLOW__CORE__LOAD_EXAMPLES=False
      - AIRFLOW__WEBSERVER__RBAC=True
    command: flower
    ports:
      - 5555:5555
  airflow:
    image: apache/airflow:1.10.10
    environment:
      - AIRFLOW__CORE__EXECUTOR=CeleryExecutor
      - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
      - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=
      - AIRFLOW__CORE__LOAD_EXAMPLES=False
      - AIRFLOW__WEBSERVER__RBAC=True
    command: webserver
    ports:
      - 8080:8080
    volumes:
      - ./airflow-data/dags:/opt/airflow/dags
      - ./airflow-data/logs:/opt/airflow/logs
      - ./airflow-data/plugins:/opt/airflow/plugins
  airflow-scheduler:
    image: apache/airflow:1.10.10
    container_name: airflow_scheduler_cont
    environment:
      - AIRFLOW__CORE__EXECUTOR=CeleryExecutor
      - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
      - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=
      - AIRFLOW__CORE__LOAD_EXAMPLES=False
      - AIRFLOW__WEBSERVER__RBAC=True
    command: scheduler
    volumes:
      - ./airflow-data/dags:/opt/airflow/dags
      - ./airflow-data/logs:/opt/airflow/logs
      - ./airflow-data/plugins:/opt/airflow/plugins
  airflow-worker1:
    image: apache/airflow:1.10.10
    container_name: airflow_worker1_cont
    environment:
      - AIRFLOW__CORE__EXECUTOR=CeleryExecutor
      - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
      - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=
      - AIRFLOW__CORE__LOAD_EXAMPLES=False
      - AIRFLOW__WEBSERVER__RBAC=True
    command: worker
    volumes:
      - ./airflow-data/dags:/opt/airflow/dags
      - ./airflow-data/logs:/opt/airflow/logs
      - ./airflow-data/plugins:/opt/airflow/plugins
  airflow-worker2:
    image: apache/airflow:1.10.10
    container_name: airflow_worker2_cont
    environment:
      - AIRFLOW__CORE__EXECUTOR=CeleryExecutor
      - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
      - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=
      - AIRFLOW__CORE__LOAD_EXAMPLES=False
      - AIRFLOW__WEBSERVER__RBAC=True
    command: worker
    volumes:
      - ./airflow-data/dags:/opt/airflow/dags
      - ./airflow-data/logs:/opt/airflow/logs
      - ./airflow-data/plugins:/opt/airflow/plugins
  airflow-worker3:
    image: apache/airflow:1.10.10
    container_name: airflow_worker3_cont
    environment:
      - AIRFLOW__CORE__EXECUTOR=CeleryExecutor
      - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
      - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow
      - AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=
      - AIRFLOW__CORE__LOAD_EXAMPLES=False
      - AIRFLOW__WEBSERVER__RBAC=True
    command: worker
    volumes:
      - ./airflow-data/dags:/opt/airflow/dags
      - ./airflow-data/logs:/opt/airflow/logs
      - ./airflow-data/plugins:/opt/airflow/plugins"><pre class="notranslate"><span class="pl-ent">version</span>: <span class="pl-s"><span class="pl-pds">'</span>3<span class="pl-pds">'</span></span>
<span class="pl-ent">services</span>:
  <span class="pl-ent">postgres</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">postgres:latest</span>
    <span class="pl-ent">environment</span>:
      - <span class="pl-s">POSTGRES_USER=postgres</span>
      - <span class="pl-s">POSTGRES_PASSWORD=postgres</span>
      - <span class="pl-s">POSTGRES_DB=airflow</span>
      - <span class="pl-s">POSTGRES_PORT=5432</span>
    <span class="pl-ent">ports</span>:
      - <span class="pl-c1">5432:5432</span>
  <span class="pl-ent">redis</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">redis:latest</span>
    <span class="pl-ent">ports</span>:
      - <span class="pl-c1">6379:6379</span>
  <span class="pl-ent">flower</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">apache/airflow:1.10.10</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./airflow-data/dags:/opt/airflow/dags</span>
    <span class="pl-ent">environment</span>:
      - <span class="pl-s">AIRFLOW__CORE__EXECUTOR=CeleryExecutor</span>
      - <span class="pl-s">AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0</span>
      - <span class="pl-s">AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=</span>
      - <span class="pl-s">AIRFLOW__CORE__LOAD_EXAMPLES=False</span>
      - <span class="pl-s">AIRFLOW__WEBSERVER__RBAC=True</span>
    <span class="pl-ent">command</span>: <span class="pl-s">flower</span>
    <span class="pl-ent">ports</span>:
      - <span class="pl-c1">5555:5555</span>
  <span class="pl-ent">airflow</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">apache/airflow:1.10.10</span>
    <span class="pl-ent">environment</span>:
      - <span class="pl-s">AIRFLOW__CORE__EXECUTOR=CeleryExecutor</span>
      - <span class="pl-s">AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0</span>
      - <span class="pl-s">AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=</span>
      - <span class="pl-s">AIRFLOW__CORE__LOAD_EXAMPLES=False</span>
      - <span class="pl-s">AIRFLOW__WEBSERVER__RBAC=True</span>
    <span class="pl-ent">command</span>: <span class="pl-s">webserver</span>
    <span class="pl-ent">ports</span>:
      - <span class="pl-c1">8080:8080</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./airflow-data/dags:/opt/airflow/dags</span>
      - <span class="pl-s">./airflow-data/logs:/opt/airflow/logs</span>
      - <span class="pl-s">./airflow-data/plugins:/opt/airflow/plugins</span>
  <span class="pl-ent">airflow-scheduler</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">apache/airflow:1.10.10</span>
    <span class="pl-ent">container_name</span>: <span class="pl-s">airflow_scheduler_cont</span>
    <span class="pl-ent">environment</span>:
      - <span class="pl-s">AIRFLOW__CORE__EXECUTOR=CeleryExecutor</span>
      - <span class="pl-s">AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0</span>
      - <span class="pl-s">AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=</span>
      - <span class="pl-s">AIRFLOW__CORE__LOAD_EXAMPLES=False</span>
      - <span class="pl-s">AIRFLOW__WEBSERVER__RBAC=True</span>
    <span class="pl-ent">command</span>: <span class="pl-s">scheduler</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./airflow-data/dags:/opt/airflow/dags</span>
      - <span class="pl-s">./airflow-data/logs:/opt/airflow/logs</span>
      - <span class="pl-s">./airflow-data/plugins:/opt/airflow/plugins</span>
  <span class="pl-ent">airflow-worker1</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">apache/airflow:1.10.10</span>
    <span class="pl-ent">container_name</span>: <span class="pl-s">airflow_worker1_cont</span>
    <span class="pl-ent">environment</span>:
      - <span class="pl-s">AIRFLOW__CORE__EXECUTOR=CeleryExecutor</span>
      - <span class="pl-s">AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0</span>
      - <span class="pl-s">AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=</span>
      - <span class="pl-s">AIRFLOW__CORE__LOAD_EXAMPLES=False</span>
      - <span class="pl-s">AIRFLOW__WEBSERVER__RBAC=True</span>
    <span class="pl-ent">command</span>: <span class="pl-s">worker</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./airflow-data/dags:/opt/airflow/dags</span>
      - <span class="pl-s">./airflow-data/logs:/opt/airflow/logs</span>
      - <span class="pl-s">./airflow-data/plugins:/opt/airflow/plugins</span>
  <span class="pl-ent">airflow-worker2</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">apache/airflow:1.10.10</span>
    <span class="pl-ent">container_name</span>: <span class="pl-s">airflow_worker2_cont</span>
    <span class="pl-ent">environment</span>:
      - <span class="pl-s">AIRFLOW__CORE__EXECUTOR=CeleryExecutor</span>
      - <span class="pl-s">AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0</span>
      - <span class="pl-s">AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=</span>
      - <span class="pl-s">AIRFLOW__CORE__LOAD_EXAMPLES=False</span>
      - <span class="pl-s">AIRFLOW__WEBSERVER__RBAC=True</span>
    <span class="pl-ent">command</span>: <span class="pl-s">worker</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./airflow-data/dags:/opt/airflow/dags</span>
      - <span class="pl-s">./airflow-data/logs:/opt/airflow/logs</span>
      - <span class="pl-s">./airflow-data/plugins:/opt/airflow/plugins</span>
  <span class="pl-ent">airflow-worker3</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">apache/airflow:1.10.10</span>
    <span class="pl-ent">container_name</span>: <span class="pl-s">airflow_worker3_cont</span>
    <span class="pl-ent">environment</span>:
      - <span class="pl-s">AIRFLOW__CORE__EXECUTOR=CeleryExecutor</span>
      - <span class="pl-s">AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0</span>
      - <span class="pl-s">AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://postgres:postgres@postgres:5432/airflow</span>
      - <span class="pl-s">AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM=</span>
      - <span class="pl-s">AIRFLOW__CORE__LOAD_EXAMPLES=False</span>
      - <span class="pl-s">AIRFLOW__WEBSERVER__RBAC=True</span>
    <span class="pl-ent">command</span>: <span class="pl-s">worker</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./airflow-data/dags:/opt/airflow/dags</span>
      - <span class="pl-s">./airflow-data/logs:/opt/airflow/logs</span>
      - <span class="pl-s">./airflow-data/plugins:/opt/airflow/plugins</span></pre></div>
<p dir="auto">Another example from <a href="https://apache-airflow.slack.com/archives/CQAMHKWSJ/p1587679356095400" rel="nofollow">https://apache-airflow.slack.com/archives/CQAMHKWSJ/p1587679356095400</a>:</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="version: '3.7'
networks:
  airflow:
    name: airflow
    attachable: true
volumes:
  logs:
x-database-env: 
  &amp;database-env
  POSTGRES_USER: airflow
  POSTGRES_DB: airflow
  POSTGRES_PASSWORD: airflow
x-airflow-env: 
  &amp;airflow-env
  AIRFLOW__CORE__EXECUTOR: CeleryExecutor
  AIRFLOW__WEBSERVER__RBAC: 'True'
  AIRFLOW__CORE__CHECK_SLAS: 'False'
  AIRFLOW__CORE__STORE_SERIALIZED_DAGS: 'False'
  AIRFLOW__CORE__PARALLELISM: 50
  AIRFLOW__CORE__LOAD_EXAMPLES: 'False'
  AIRFLOW__CORE__LOAD_DEFAULT_CONNECTIONS: 'False'
  AIRFLOW__SCHEDULER__SCHEDULER_HEARTBEAT_SEC: 10
  
services:
  postgres:
    image: postgres:11.5
    environment:
      &lt;&lt;: *database-env
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - 5432:5432
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./database/data:/var/lib/postgresql/data/pgdata
      - ./database/logs:/var/lib/postgresql/data/log
    command: &gt;
     postgres
       -c listen_addresses=*
       -c logging_collector=on
       -c log_destination=stderr
       -c max_connections=200
    networks:
      - airflow
  redis:
    image: redis:5.0.5
    environment:
      REDIS_HOST: redis
      REDIS_PORT: 6379
    ports:
      - 6379:6379
    networks:
      - airflow
  webserver:
    image: airflow:1.10.10
    user: airflow
    ports:
      - 8090:8080
    volumes:
      - ./dags:/opt/airflow/dags
      - logs:/opt/airflow/logs
      - ./files:/opt/airflow/files
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      &lt;&lt;: *database-env
      &lt;&lt;: *airflow-env
      ADMIN_PASSWORD: airflow
    depends_on:
      - postgres
      - redis
    command: webserver
    healthcheck:
      test: [&quot;CMD-SHELL&quot;, &quot;[ -f /opt/airflow/airflow-webserver.pid ]&quot;]
      interval: 30s
      timeout: 30s
      retries: 3
    networks:
      - airflow
  flower:
    image: airflow:1.10.10
    user: airflow
    ports:
      - 5555:5555
    depends_on:
      - redis
    volumes:
      - logs:/opt/airflow/logs
    command: flower
    networks:
      - airflow
  scheduler:
    image: airflow:1.10.10
    volumes:
      - ./dags:/opt/airflow/dags
      - logs:/opt/airflow/logs
      - ./files:/opt/airflow/files
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      &lt;&lt;: *database-env
    command: scheduler
    networks:
      - airflow
  worker:
    image: airflow:1.10.10
    user: airflow
    volumes:
      - ./dags:/opt/airflow/dags
      - logs:/opt/airflow/logs
      - ./files:/opt/airflow/files
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      &lt;&lt;: *database-env
    command: worker
    depends_on:
      - scheduler"><pre class="notranslate"><span class="pl-ent">version</span>: <span class="pl-s"><span class="pl-pds">'</span>3.7<span class="pl-pds">'</span></span>
<span class="pl-ent">networks</span>:
  <span class="pl-ent">airflow</span>:
    <span class="pl-ent">name</span>: <span class="pl-s">airflow</span>
    <span class="pl-ent">attachable</span>: <span class="pl-c1">true</span>
<span class="pl-ent">volumes</span>:
  <span class="pl-ent">logs</span>:
<span class="pl-ent">x-database-env</span>: 
  <span class="pl-s">&amp;database-env</span>
  <span class="pl-ent">POSTGRES_USER</span>: <span class="pl-s">airflow</span>
  <span class="pl-ent">POSTGRES_DB</span>: <span class="pl-s">airflow</span>
  <span class="pl-ent">POSTGRES_PASSWORD</span>: <span class="pl-s">airflow</span>
<span class="pl-ent">x-airflow-env</span>: 
  <span class="pl-s">&amp;airflow-env</span>
  <span class="pl-ent">AIRFLOW__CORE__EXECUTOR</span>: <span class="pl-s">CeleryExecutor</span>
  <span class="pl-ent">AIRFLOW__WEBSERVER__RBAC</span>: <span class="pl-s"><span class="pl-pds">'</span>True<span class="pl-pds">'</span></span>
  <span class="pl-ent">AIRFLOW__CORE__CHECK_SLAS</span>: <span class="pl-s"><span class="pl-pds">'</span>False<span class="pl-pds">'</span></span>
  <span class="pl-ent">AIRFLOW__CORE__STORE_SERIALIZED_DAGS</span>: <span class="pl-s"><span class="pl-pds">'</span>False<span class="pl-pds">'</span></span>
  <span class="pl-ent">AIRFLOW__CORE__PARALLELISM</span>: <span class="pl-c1">50</span>
  <span class="pl-ent">AIRFLOW__CORE__LOAD_EXAMPLES</span>: <span class="pl-s"><span class="pl-pds">'</span>False<span class="pl-pds">'</span></span>
  <span class="pl-ent">AIRFLOW__CORE__LOAD_DEFAULT_CONNECTIONS</span>: <span class="pl-s"><span class="pl-pds">'</span>False<span class="pl-pds">'</span></span>
  <span class="pl-ent">AIRFLOW__SCHEDULER__SCHEDULER_HEARTBEAT_SEC</span>: <span class="pl-c1">10</span>
  
<span class="pl-ent">services</span>:
  <span class="pl-ent">postgres</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">postgres:11.5</span>
    <span class="pl-ent">environment</span>:
      <span class="pl-ent">&lt;&lt;</span>: <span class="pl-s">*database-env</span>
      <span class="pl-ent">PGDATA</span>: <span class="pl-s">/var/lib/postgresql/data/pgdata</span>
    <span class="pl-ent">ports</span>:
      - <span class="pl-c1">5432:5432</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">/var/run/docker.sock:/var/run/docker.sock</span>
      - <span class="pl-s">./database/data:/var/lib/postgresql/data/pgdata</span>
      - <span class="pl-s">./database/logs:/var/lib/postgresql/data/log</span>
    <span class="pl-ent">command</span>: <span class="pl-s">&gt;</span>
<span class="pl-s">     postgres</span>
<span class="pl-s">       -c listen_addresses=*</span>
<span class="pl-s">       -c logging_collector=on</span>
<span class="pl-s">       -c log_destination=stderr</span>
<span class="pl-s">       -c max_connections=200</span>
<span class="pl-s"></span>    <span class="pl-ent">networks</span>:
      - <span class="pl-s">airflow</span>
  <span class="pl-ent">redis</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">redis:5.0.5</span>
    <span class="pl-ent">environment</span>:
      <span class="pl-ent">REDIS_HOST</span>: <span class="pl-s">redis</span>
      <span class="pl-ent">REDIS_PORT</span>: <span class="pl-c1">6379</span>
    <span class="pl-ent">ports</span>:
      - <span class="pl-c1">6379:6379</span>
    <span class="pl-ent">networks</span>:
      - <span class="pl-s">airflow</span>
  <span class="pl-ent">webserver</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">airflow:1.10.10</span>
    <span class="pl-ent">user</span>: <span class="pl-s">airflow</span>
    <span class="pl-ent">ports</span>:
      - <span class="pl-c1">8090:8080</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./dags:/opt/airflow/dags</span>
      - <span class="pl-s">logs:/opt/airflow/logs</span>
      - <span class="pl-s">./files:/opt/airflow/files</span>
      - <span class="pl-s">/var/run/docker.sock:/var/run/docker.sock</span>
    <span class="pl-ent">environment</span>:
      <span class="pl-ent">&lt;&lt;</span>: <span class="pl-s">*database-env</span>
      <span class="pl-ent">&lt;&lt;</span>: <span class="pl-s">*airflow-env</span>
      <span class="pl-ent">ADMIN_PASSWORD</span>: <span class="pl-s">airflow</span>
    <span class="pl-ent">depends_on</span>:
      - <span class="pl-s">postgres</span>
      - <span class="pl-s">redis</span>
    <span class="pl-ent">command</span>: <span class="pl-s">webserver</span>
    <span class="pl-ent">healthcheck</span>:
      <span class="pl-ent">test</span>: <span class="pl-s">["CMD-SHELL", "[ -f /opt/airflow/airflow-webserver.pid ]"]</span>
      <span class="pl-ent">interval</span>: <span class="pl-c1">30s</span>
      <span class="pl-ent">timeout</span>: <span class="pl-c1">30s</span>
      <span class="pl-ent">retries</span>: <span class="pl-c1">3</span>
    <span class="pl-ent">networks</span>:
      - <span class="pl-s">airflow</span>
  <span class="pl-ent">flower</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">airflow:1.10.10</span>
    <span class="pl-ent">user</span>: <span class="pl-s">airflow</span>
    <span class="pl-ent">ports</span>:
      - <span class="pl-c1">5555:5555</span>
    <span class="pl-ent">depends_on</span>:
      - <span class="pl-s">redis</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">logs:/opt/airflow/logs</span>
    <span class="pl-ent">command</span>: <span class="pl-s">flower</span>
    <span class="pl-ent">networks</span>:
      - <span class="pl-s">airflow</span>
  <span class="pl-ent">scheduler</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">airflow:1.10.10</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./dags:/opt/airflow/dags</span>
      - <span class="pl-s">logs:/opt/airflow/logs</span>
      - <span class="pl-s">./files:/opt/airflow/files</span>
      - <span class="pl-s">/var/run/docker.sock:/var/run/docker.sock</span>
    <span class="pl-ent">environment</span>:
      <span class="pl-ent">&lt;&lt;</span>: <span class="pl-s">*database-env</span>
    <span class="pl-ent">command</span>: <span class="pl-s">scheduler</span>
    <span class="pl-ent">networks</span>:
      - <span class="pl-s">airflow</span>
  <span class="pl-ent">worker</span>:
    <span class="pl-ent">image</span>: <span class="pl-s">airflow:1.10.10</span>
    <span class="pl-ent">user</span>: <span class="pl-s">airflow</span>
    <span class="pl-ent">volumes</span>:
      - <span class="pl-s">./dags:/opt/airflow/dags</span>
      - <span class="pl-s">logs:/opt/airflow/logs</span>
      - <span class="pl-s">./files:/opt/airflow/files</span>
      - <span class="pl-s">/var/run/docker.sock:/var/run/docker.sock</span>
    <span class="pl-ent">environment</span>:
      <span class="pl-ent">&lt;&lt;</span>: <span class="pl-s">*database-env</span>
    <span class="pl-ent">command</span>: <span class="pl-s">worker</span>
    <span class="pl-ent">depends_on</span>:
      - <span class="pl-s">scheduler</span></pre></div>
<p dir="auto"><em>Related issues</em><br>
The initial user creation <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="608272731" data-permission-text="Title is private" data-url="https://github.com/apache/airflow/issues/8606" data-hovercard-type="issue" data-hovercard-url="/apache/airflow/issues/8606/hovercard" href="https://github.com/apache/airflow/issues/8606">#8606</a>, <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="606509422" data-permission-text="Title is private" data-url="https://github.com/apache/airflow/issues/8548" data-hovercard-type="issue" data-hovercard-url="/apache/airflow/issues/8548/hovercard" href="https://github.com/apache/airflow/issues/8548">#8548</a><br>
Quick start documentation planned in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="606440721" data-permission-text="Title is private" data-url="https://github.com/apache/airflow/issues/8542" data-hovercard-type="issue" data-hovercard-url="/apache/airflow/issues/8542/hovercard" href="https://github.com/apache/airflow/issues/8542">#8542</a></p>