我们在使用 Airflow 时遇到权限错误,收到以下错误:
PermissionError: [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler/2019-12-18/../../../../home
我们尝试在容器内的 /usr/local/airflow/logs/schedule 目录上使用 chmod 777 -R,但这似乎没有成功。
我们的entrypoint.sh脚本中有这一段:
export AIRFLOW__CORE__BASE_LOGS_FOLDER="/usr/local/airflow/logs
还有其他人遇到过这个气流日志权限问题吗?似乎无法在网上找到太多关于此的信息。
绑定安装的文件夹权限也可能导致此错误。
例如:
docker-compose.yml(伪代码)
service_name:
...
volumes:
- /home/user/airflow_logs:/opt/airflow/logs
授予本地文件夹权限,以便气流容器可以写入日志、根据需要创建目录等,
sudo chmod u=rwx,g=rwx,o=rwx /home/user/airflow_logs
仅供有同样问题的人...
令人惊讶的是,我不得不查看 Airflow 文档...并根据它:
在 Linux 上,容器中挂载的卷使用本机 Linux 文件系统用户/组权限,因此您必须确保容器和主机具有匹配的文件权限。
mkdir ./dags ./logs ./plugins
echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
一旦您拥有匹配的文件权限:
docker-compose up airflow-init
docker-compose up
我解决了这个问题:就我而言,问题是卷安装的文件夹,
logs
和dags
没有写权限。我添加了
chmod -R 777 dags/
chmod -R 777 logs/
并且在 docker-composer 文件中它们被安装为
volumes:
- ./dags:/opt/bitnami/airflow/dags
- ./logs:/opt/bitnami/airflow/logs
我也有同样的错误。
PermissionError: [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler'
我收到该错误的原因是因为我在运行 Airflow docker 容器之前没有创建最初的 3 个文件夹(dags、logs、plugins)。所以docker似乎已经自动创建了,但是权限错误。
修复步骤:
docker-compose down --volumes --remove-orphans
mkdir logs dags plugins
docker-compose up airflow-init
docker-compose up
我使用 Apache Airflow 1.10.7 也遇到同样的问题。
Traceback (most recent call last):
File "/usr/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
self.run()
File "/usr/lib/python3.7/multiprocessing/process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "/home/radifar/.virtualenvs/airflow/lib/python3.7/site-packages/airflow/jobs/scheduler_job.py", line 135, in _run_file_processor
set_context(log, file_path)
File "/home/radifar/.virtualenvs/airflow/lib/python3.7/site-packages/airflow/utils/log/logging_mixin.py", line 198, in set_context
handler.set_context(value)
File "/home/radifar/.virtualenvs/airflow/lib/python3.7/site-packages/airflow/utils/log/file_processor_handler.py", line 65, in set_context
local_loc = self._init_file(filename)
File "/home/radifar/.virtualenvs/airflow/lib/python3.7/site-packages/airflow/utils/log/file_processor_handler.py", line 148, in _init_file
os.makedirs(directory)
File "/home/radifar/.virtualenvs/airflow/lib/python3.7/os.py", line 211, in makedirs
makedirs(head, exist_ok=exist_ok)
File "/home/radifar/.virtualenvs/airflow/lib/python3.7/os.py", line 211, in makedirs
makedirs(head, exist_ok=exist_ok)
File "/home/radifar/.virtualenvs/airflow/lib/python3.7/os.py", line 211, in makedirs
makedirs(head, exist_ok=exist_ok)
[Previous line repeated 5 more times]
File "/home/radifar/.virtualenvs/airflow/lib/python3.7/os.py", line 221, in makedirs
mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/media/radifar/radifar-dsl/Workflow/Airflow/airflow-home/logs/scheduler/2020-01-04/../../../../../../../home'
检查 file_processor_handler.py 的工作原理后,我发现该错误是由示例 dag 和我们的 dag 文件夹设置的不同目录位置引起的。在我的例子中,文件夹 2020-01-04 上方的第 7 个文件夹是 /media/radifar。在您的情况下,文件夹 2019-12-18 上方的 4 个文件夹是 /usr/local。这就是引发 PermissionError 的原因。
我能够通过清理 AIRFLOW_HOME 文件夹然后运行
airflow version
,在airflow.cfg 中将 load_example 设置为 False 来解决这个问题。然后运行airflow initdb
。之后我就可以使用气流而不会出现错误。
我在 Windows 托管的 docker 上运行 Airflow 映像时遇到了同样的问题。
我的解决方案是在启动默认 CMD 之前,使用设置文件权限的 CMD 覆盖调度程序的 dockerfile 中的 CMD。
默认的CMD可以通过
docker inspect -f '{{.Config.Cmd}}' <schedulerImageId>
获取。
示例。我使用了 bitnami 镜像( docker.io/bitnami/airflow-scheduler:2.1.4-debian-10-r16 )。检查图像我发现默认的 CMD 是
/opt/bitnami/scripts/airflow-scheduler/run.sh
所以我创建了一个
run.sh
脚本,其中包含以下内容:
#! /bin/bash
chmod -R 777 /opt/bitnami/airflow/logs/
. /opt/bitnami/scripts/airflow-scheduler/run.sh
然后我在 dockerfile 的末尾添加了以下几行:
COPY run.sh /
RUN chmod +x /run.sh
CMD /run.sh
有点晚了,但您可以将用户添加到默认组,这会创建目录。
当你的 docker-compose 启动后,你可以运行服务
docker-compose exec SERVICE_NAME bash
并检查特定目录属于哪个组,然后将此组添加到你的用户权限中 docker-compose.yml
:
service_name:
...
user: USER_NAME:USER_GROUP
另一种方法是将文件复制到图像中,同时更改所有权。
COPY --chown=airflow . .
我也遇到了同样的问题,Dominik Sajovic 的解决方案帮助了我。
值得注意的是,在我的例子中,日志既没有写入 Web UI,也没有写入容器的文件系统,但我可以在运行容器的 CLI 中看到错误。似乎 Airflow 无法为所有单独的 DAG 和任务的日志创建子文件夹,老实说,在绑定到容器的本地目录中创建这些子文件夹是一种选择(假设您没有那么多 DAG)。