Как исправить ошибку «отказано в разрешении» при запуске docker-compose

#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