首页 > 解决方案 > 将 apache 气流 docker 运算符与无根 docker 一起使用

问题描述

我正在开发一个使用 apache 气流来安排不同脚本的项目。

Airflow 本身和设置 DAG 的脚本捆绑在一个 Dockerfile 中。每个 DAG 的中心部分是一个 dockeroperator,它在主机系统上启动相应的容器。
(注意:要求每个气流及其调度的脚本每个都有一个 Dockerfile)

目前,主机系统上的 docker 具有此处建议的 root 权限。启动气流容器时,我使用-v /var/run/docker.sock:/var/run/docker.sock创建一个卷。在这种配置中,气流按预期启动容器并且没有问题。

但是,因为以 root 权限运行 docker 似乎不安全,所以我尝试了 docker 的无根模式(https://docs.docker.com/engine/security/rootless/)。

设置后,所有容器在主机上都可以正常工作。只有当我运行气流容器时,我才会遇到问题。

错误信息很长,所以我只发布最后一行:docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', PermissionError(13, 'Permission denied'))

此错误与我在整个设置的早期迭代中未创建上述卷时遇到的错误相同,因此该问题可能与气流容器中的 docker 守护进程没有正确的权限有关,但我没有不知道如何解决这个问题。

标签: dockerairflow

解决方案


您可以使用 docker compose 启动整个设置。docker-compose 文件的一个很好的起点是这里给出的: https ://airflow.apache.org/docs/apache-airflow/stable/start/docker.html

您可以选择默认 UID=50000 和 GID=0 或自定义 UID。在主机上创建此 UID,创建一个 docker 组并将此用户添加到该组。然后将容器内的气流用户添加到该组中。您可以通过添加在撰写文件中执行此操作

group_add:
  - <docker GID>

笔记!如果您使用自定义映像并将用户添加到 Dockerfile 中的 docker 组,则它不起作用,因为这些设置被 docker compose startup.sh 覆盖

此外,您必须将 docker.sock 文件挂载到容器中

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

推荐阅读