#docker #docker-compose #airflow #airflow-scheduler
Вопрос:
Я запускаю Airflow 2.0 с помощью docker, при запуске sudo docker-compose up --build
я получаю сообщение об ошибке
ОШИБКА: для apache_airflow_scheduler_1 Не удается запустить планировщик службы: Не удалось создать среду выполнения OCI: container_linux.go:380: запуск процесса контейнера вызван: exec: «./scripts/airflow-entrypoint.sh»: отказано в разрешении: неизвестно
ОШИБКА: для веб-сервера не удается запустить службу веб-сервер: Не удалось создать среду выполнения OCI: container_linux.go:380: запуск процесса контейнера вызван: exec: «./scripts/airflow-entrypoint.sh»: отказано в разрешении: неизвестно
ОШИБКА: для планировщика не удается запустить службу планировщик: Не удалось создать среду выполнения OCI: container_linux.go:380: запуск процесса контейнера вызван: exec: «./scripts/airflow-entrypoint.sh»: отказано в разрешении: неизвестно
ОШИБКА: Возникли ошибки при запуске проекта.
мой макет для docker-compose таков
version: "2.1"
services:
postgres: # metadata database
image: postgres:12
environment:
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
ports:
- "5434:5432" # mapping the port 5432 of postgres container with 5434 of local machine
scheduler:
build:
context: .
dockerfile: Dockerfile
restart: on-failure
command: scheduler
entrypoint: ./scripts/airflow-entrypoint.sh
depends_on:
- postgres
env_file:
- .env
ports:
- "8794:8793"
volumes:
- ./dags:/opt/airflow/dags
- ./airflow-logs:/opt/airflow/logs
- ./scripts:/opt/airflow/scripts
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
webserver:
build:
context: .
dockerfile: Dockerfile
hostname: webserver
restart: always
depends_on:
- postgres
command: webserver
env_file:
- .env
volumes:
- ./dags:/opt/airflow/dags
- ./scripts:/opt/airflow/scripts
- ./airflow-logs:/opt/airflow/logs
ports:
- "8088:8080"
entrypoint: ./scripts/airflow-entrypoint.sh
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 32
Докерфайл
FROM apache/airflow
USER root
ARG AIRFLOW_HOME=/opt/airflow
ADD dags /opt/airflow/dags
RUN pip install --upgrade pip
RUN chown -R airflow:airflow $AIRFLOW_HOME
USER airflow
RUN pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org boto3
USER ${AIRFLOW_UID}
Мой макет для моего airflow-entrypoint.sh является
#!/usr/bin/env bash
airflow db init
airflow db upgrade
airflow users create -r Admin -u admin -e MY_EMAIL -f MY_FIRSTNAME -l MY_LASTNAME -p admin
airflow scheduler amp;
airflow webserver
Как я могу это решить? Я предполагаю, что я выполняю chmod x, но где мне его разместить, так как веб-сервер двух изображений и планировщик являются пользовательскими изображениями.
Комментарии:
1. пожалуйста, поделитесь файлом настройки служб, чтобы ваша проблема была воспроизводимой
2. @rok я включил файл dokerfile
Ответ №1:
Я не думаю, что ваша проблема в разрешении, ваша проблема в том, что вы не используете docker-составьте так, как он предназначен для использования с воздушным потоком.
Прежде всего — не используйте sudo
— это запускает ваш docker compose как root
, и вам не нужно этого делать.
Просто следуйте за мной https://docs.docker.com/engine/install/linux-postinstall/ и сделайте возможным запуск docker от имени вашего собственного пользователя.
Во — вторых, вы пытаетесь запустить свой планировщик и веб-сервер в одном контейнере, что имеет очень мало смысла, особенно если у вас уже есть один контейнер для планировщика и один для веб-сервера, и все же по какой-то причине вы пытаетесь запустить и планировщик, и веб-сервер в своей точке входа? Таким образом, вы получите как планировщик, так и веб-сервер, запущенные дважды в обоих контейнерах.
Как правило, в одном контейнере должен выполняться один процесс (веб-сервер или планировщик), и для их запуска вам не нужна пользовательская точка входа.
В — третьих, запуск db init
и db upgrade
в одной и той же точке входа также имеет очень мало смысла, они будут запускаться каждый раз, когда вы запускаете какую-либо команду, и в этом совершенно нет необходимости. Поскольку вы используете базу данных postgres, достаточно запустить ее один раз, используя пользовательское задание «инициализация».
Если вы избавитесь от них, вам не понадобится пользовательская точка входа (и если вы используете официальное изображение воздушного потока, вам все равно не следует этого делать, потому что официальное изображение точки входа уже обрабатывает для вас много вещей: https://airflow.apache.org/docs/docker-stack/entrypoint.html и пропустить точку входа или заменить ее своей собственной-довольно плохая идея.
Вместо этого вы можете использовать команду «bash» для изображения и запускать там все, что захотите.
Я бы настоятельно рекомендовал вам взглянуть на быстрый запуск docker-compose, который у нас есть в Airflow, в качестве примера того, что и как вы должны делать с docker-compose : https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html