Docker Community Forums

Share and learn in the Docker community.

Docker Compose Error

I’m trying to deploy airflow on docker, and I’m having trouble with the docker compose file. Any ideas on how to fix it.

version: ‘3.4’
x-airflow-common:
&airflow-common
build:
context: .
environment:
&airflow-common-env
AIRFLOW__CORE__EXECUTOR: CeleryExecutor
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow
AIRFLOW__CELERY__BROKER_URL: redis://:@redis:6379/0
AIRFLOW__CORE__FERNET_KEY: ‘’
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: ‘true’
AIRFLOW__CORE__LOAD_EXAMPLES: ‘false’
AIRFLOW__API__AUTH_BACKEND: ‘airflow.api.auth.backend.basic_auth’
volumes:
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./plugins:/opt/airflow/plugins
user: “${AIRFLOW_UID:-50000}:${AIRFLOW_GID:-50000}”
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy

services:
postgres:
image: postgres:13
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
volumes:
- postgres-db-volume:/var/lib/postgresql/data
healthcheck:
test: [“CMD”, “pg_isready”, “-U”, “airflow”]
interval: 5s
retries: 5
restart: always

redis:
image: redis:latest
ports:
- 6379:6379
healthcheck:
test: [“CMD”, “redis-cli”, “ping”]
interval: 5s
timeout: 30s
retries: 50
restart: always

airflow-webserver:
<<: *airflow-common
command: webserver
ports:
- 8080:8080
healthcheck:
test: [“CMD”, “curl”, “–fail”, “http://localhost:8080/health”]
interval: 10s
timeout: 10s
retries: 5
restart: always

airflow-scheduler:
<<: *airflow-common
command: scheduler
restart: always

airflow-worker:
<<: *airflow-common
command: celery worker
restart: always

airflow-init:
<<: *airflow-common
command: version
environment:
<<: *airflow-common-env
_AIRFLOW_DB_UPGRADE: ‘true’
_AIRFLOW_WWW_USER_CREATE: ‘true’
_AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow}
_AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow}

flower:
<<: *airflow-common
command: celery flower
ports:
- 5555:5555
healthcheck:
test: [“CMD”, “curl”, “–fail”, “http://localhost:5555/”]
interval: 10s
timeout: 10s
retries: 5
restart: always

volumes:
postgres-db-volume:

Error Message:

ERROR: The Compose file ‘.\docker-compose.yml’ is invalid because:
services.airflow-init.depends_on contains an invalid type, it should be an array
services.airflow-scheduler.depends_on contains an invalid type, it should be an array
services.airflow-webserver.depends_on contains an invalid type, it should be an array
services.airflow-worker.depends_on contains an invalid type, it should be an array
services.flower.depends_on contains an invalid type, it should be an array

Whitespace matters in YAML. Can you please edit your post to get some formatting?

For example, use:

```yaml
your:
  yaml: here
```

…to preserve whitespace and get:

your:
  yaml: here

It should be like this:

depends_on:
 - "redis"

Indeed, the error “depends_on contains an invalid type, it should be an array” seems to indicate (only) an array is expected, and so does the Compose documentation. However, Airflow’s documentation shows a January 2021 example (see GitHub for syntax highlighting and history) that uses a dictionary:

  depends_on:
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy

I’d very much assume the example to be okay, and the Compose specification also allows for that “long syntax”. But maybe that needs version: '3.9'?

(If the example should work for version: '3.4' too, then maybe the whitespace was already messed up before posting here?)