Используйте Java с Airflow и Docker

#java #docker #airflow

#java #docker #воздушный поток

Вопрос:

У меня есть вариант использования, когда я хочу запустить файл jar через Airflow, и все это должно находиться в контейнере Docker на Mac.

Я попытался установить java отдельно, а также попытался установить мой JAVA_HOME (хост) в контейнер.

Это мой docker-compose.yaml:

 airflow:
    image: 'puckel/docker-airflow:1.10.9'
    hostname: airflow
    container_name: airflow
    volumes:
      - ${PWD}/airflow/dags:/usr/local/airflow/dags
      - ${JAVA_HOME}:/usr/local/bin/java //FWD MOUNTING JAVA_HOME
 

Таким образом, я получаю каталог java внутри /usr/local/bin/ с данными, но java -version возвращает Permission denied .
Изменение его на ${JAVA_HOME}/bin/java:/usr/local/bin/java возврат exec format error .

Каков правильный способ обработки этого варианта использования?

Ответ №1:

Я думаю, что вы получаете Permission denied , потому что используете docker с пользователем airflow .

Можете ли вы попробовать запустить его как root ? (это рискованно! не используйте в производстве — это просто попытка временного обхода). Избегайте использования root user!

 airflow:
    image: 'puckel/docker-airflow:1.10.9'
    hostname: airflow
    container_name: airflow
    user: root
    volumes:
      - ${PWD}/airflow/dags:/usr/local/airflow/dags
      - ${JAVA_HOME}:/usr/local/bin/java

 

Редактировать:
Вместо того, чтобы монтировать локальную java, рассмотрите возможность установки отдельной java:

 airflow:
    build:
      context: .
      dockerfile: Dockerfile
    hostname: airflow
    container_name: airflow
    volumes:
      - ${PWD}/airflow/dags:/usr/local/airflow/dags
 

и добавьте Dockerfile в тот же каталог:

 FROM puckel/docker-airflow:1.10.9
USER root
RUN mkdir -p /usr/share/man/man1
RUN apt-get update amp;amp; apt-get install -y default-jdk amp;amp; apt-get clean
USER airflow
 

Комментарии:

1. Это не работает. JAVA_HOME не является ссылкой на исполняемый файл в моей системе. JAVA_HOME-> bin-> java также является исполняемым файлом в хост-системе.

2. @proprius вы можете либо смонтировать исполняемый файл, либо установить java в образ. Я отредактировал ответ выше

3. И, как и в 99% случаев, идея «запускаться от имени root» является неправильным подходом. Помните, что тысячи людей могут прочитать ваш ответ в будущем. Будьте очень осторожны, чтобы нигде не указывать «запуск от имени root».

4. @GhostCat верно. Я предполагаю, что он выполняет POC, потому что большинство людей тоже не будут монтировать свою java. Я предложил другое решение — установить java в контейнер. В любом случае — я проясню root проблему в своем ответе — спасибо!

5. Я понял, почему монтирование не работает. Я использую macOS, поэтому Java, установленная на моем компьютере, отличалась от той, которая требовалась Docker (которая использует Debian на хосте OSX).