Errno 13 当 Airflow 尝试写入日志时权限被拒绝

问题描述 投票:0回答:9

我们在使用 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

还有其他人遇到过这个气流日志权限问题吗?似乎无法在网上找到太多关于此的信息。

logging permissions airflow airflow-scheduler
9个回答
11
投票

绑定安装的文件夹权限也可能导致此错误。

例如:

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

10
投票

仅供有同样问题的人...

令人惊讶的是,我不得不查看 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

9
投票

我解决了这个问题:就我而言,问题是卷安装的文件夹,

logs
dags
没有写权限。我添加了

chmod -R 777 dags/
chmod -R 777 logs/

并且在 docker-composer 文件中它们被安装为

    volumes:
      - ./dags:/opt/bitnami/airflow/dags
      - ./logs:/opt/bitnami/airflow/logs

4
投票

我也有同样的错误。

PermissionError: [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler'

我收到该错误的原因是因为我在运行 Airflow docker 容器之前没有创建最初的 3 个文件夹(dags、logs、plugins)。所以docker似乎已经自动创建了,但是权限错误。

修复步骤:

  1. 停止当前容器
docker-compose down --volumes --remove-orphans
  1. 删除文件夹 dags、日志、插件
  2. 以防万一,销毁已经创建的镜像和卷(在 Docker Desktop 中)
  3. 从命令行再次创建文件夹
mkdir logs dags plugins
  1. 再次运行气流泊坞窗
docker-compose up airflow-init
docker-compose up

2
投票

我使用 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
。之后我就可以使用气流而不会出现错误。


0
投票

我在 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

0
投票

有点晚了,但您可以将用户添加到默认组,这会创建目录。

当你的 docker-compose 启动后,你可以运行服务

docker-compose exec SERVICE_NAME bash
并检查特定目录属于哪个组,然后将此组添加到你的用户权限中
docker-compose.yml
:

service_name:
     ...
     user: USER_NAME:USER_GROUP

0
投票

另一种方法是将文件复制到图像中,同时更改所有权。

COPY --chown=airflow . .

0
投票

我也遇到了同样的问题,Dominik Sajovic 的解决方案帮助了我。

值得注意的是,在我的例子中,日志既没有写入 Web UI,也没有写入容器的文件系统,但我可以在运行容器的 CLI 中看到错误。似乎 Airflow 无法为所有单独的 DAG 和任务的日志创建子文件夹,老实说,在绑定到容器的本地目录中创建这些子文件夹是一种选择(假设您没有那么多 DAG)。

© www.soinside.com 2019 - 2024. All rights reserved.