#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).