#docker #airflow
#docker #воздушный поток
Вопрос:
Я создаю изображение поверх apache/airflow:latest
из docker hub, которое копирует локальные базы данных и плагины. После создания локального образа воздушного потока я выполнил команду docker run -it local_airflow:latest list_dags
, чтобы перечислить недавно скопированные базы данных, но я получаю результат:
Unable to load the config, contains a configuration error.
Traceback (most recent call last):
File "/usr/local/lib/python3.6/logging/config.py", line 565, in configure
handler = self.configure_handler(handlers[name])
File "/usr/local/lib/python3.6/logging/config.py", line 738, in configure_handler
result = factory(**kwargs)
File "/home/airflow/.local/lib/python3.6/site-packages/airflow/utils/log/file_processor_handler.py", line 50, in __init__
os.makedirs(self._get_log_directory())
File "/usr/local/lib/python3.6/os.py", line 220, in makedirs
mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/opt/airflow/logs/scheduler/2020-09-03'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/airflow/.local/bin/airflow", line 25, in <module>
from airflow.configuration import conf
File "/home/airflow/.local/lib/python3.6/site-packages/airflow/__init__.py", line 47, in <module>
settings.initialize()
File "/home/airflow/.local/lib/python3.6/site-packages/airflow/settings.py", line 402, in initialize
LOGGING_CLASS_PATH = configure_logging()
File "/home/airflow/.local/lib/python3.6/site-packages/airflow/logging_config.py", line 68, in configure_logging
raise e
File "/home/airflow/.local/lib/python3.6/site-packages/airflow/logging_config.py", line 63, in configure_logging
dictConfig(logging_config)
File "/usr/local/lib/python3.6/logging/config.py", line 802, in dictConfig
dictConfigClass(config).configure()
File "/usr/local/lib/python3.6/logging/config.py", line 573, in configure
'%r: %s' % (name, e))
ValueError: Unable to configure handler 'processor': [Errno 13] Permission denied: '/opt/airflow/logs/scheduler/2020-09-03'
Вот файл Dockerfile, который создается поверх базового образа воздушного потока:
FROM apache/airflow:latest
USER airflow
ARG REQUIREMENTS_TXT=""
ENV REQUIREMENTS_TXT=${REQUIREMENTS_TXT}
COPY $REQUIREMENTS_TXT $REQUIREMENTS_TXT
ARG AIRFLOW_CONSTRAINTS_URL=""
ENV AIRFLOW_CONSTRAINTS_URL=${AIRFLOW_CONSTRAINTS_URL}
RUN if [ ! -z "${REQUIREMENTS_TXT}" ]; then pip install --user --upgrade pip amp;amp;
pip install --user -r "${REQUIREMENTS_TXT}"
--constraint "${AIRFLOW_CONSTRAINTS_URL}"; fi
ARG DAGS_FOLDER="dags/"
ENV DAGS_FOLDER=${DAGS_FOLDER}
COPY dags/ $AIRFLOW_HOME/dags/
ARG PLUGINS_FOLDER="plugins/"
ENV PLUGINS_FOLDER=${PLUGINS_FOLDER}
COPY plugins/ $AIRFLOW_HOME/plugins/
Вот команда сборки docker
docker build .
--tag local_airflow:latest
--build-arg DAGS_FOLDER="dags/"
--build-arg PLUGINS_FOLDER="plugins/"
Ответ №1:
Проблема в том, что владельцем этих файлов является (почти наверняка) root. Поэтому у вас нет прав что-либо там менять.
Я предлагаю изменить команду КОПИРОВАНИЯ, чтобы она выглядела следующим образом:
COPY --chown=airflow ... ...
Это изменит владельца файла / папки на воздушный поток.
Для получения дополнительной информации ознакомьтесь с документацией:https://docs.docker.com/engine/reference/builder/#copy
Комментарии:
1. Спасибо за четкое объяснение и ссылку на документы
Ответ №2:
Как указано в документах:https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html#initializing-environment
mkdir -p ./dags ./logs ./plugins
echo -e "AIRFLOW_UID=$(id -u)" > .env
AIRFLOW_UID=50000
В противном случае файлы создаются от имени пользователей root.