在Docker内运行Docker容器时的空气流动

10

我在EC2实例上运行了Airflow,并且安排了一些任务来启动Docker容器。我该如何做?我需要在我的Airflow容器中安装Docker吗?接下来的步骤是什么?我有一个yaml文件用于启动容器,它派生自puckel/airflow Docker镜像。


我认为在Docker容器内安装Docker有点像梦中梦。如果可能的话,最好使用ECS或Lambda或其他无服务器解决方案。 - Davos
3个回答

7
我有一个更简单的解决方案,只需要一个短的Dockerfile来构建派生镜像:
FROM puckel/docker-airflow

USER root
RUN groupadd --gid 999 docker \
    && usermod -aG docker airflow
USER airflow

然后

docker build -t airflow_image .
docker run -v /var/run/docker.sock:/var/run/docker.sock:ro \
    -v /usr/bin/docker:/bin/docker:ro \
    -v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7:ro \
    -d airflow_image

1
这里的主要思想是将Docker容器的Docker组ID与主机的Docker组ID匹配。因此,为了使其正常工作,您的主机上必须有一个ID为999的Docker组,否则这将无法正常工作。 - Gabriel Avellaneda

5

最终解决方案

我的EC2设置正在运行ubuntu Xenial 16.04,并使用修改过的puckel/airflow docker镜像来运行airflow。

需要更改Dockerfile中的内容:

在Dockerfile顶部添加USER root

对我来说,将docker bin挂载不起作用,所以我不得不在我的docker容器中安装docker二进制文件

从Docker Inc.存储库安装Docker。

RUN curl -sSL https://get.docker.com/ | sh

在互联网上搜索wrapdocker文件。将其复制到Dockerfile所在的scripts目录中。这会在airflow docker内部启动docker守护程序。

安装魔术包装器

ADD ./script/wrapdocker /usr/local/bin/wrapdocker RUN chmod +x /usr/local/bin/wrapdocker

将airflow用户添加到docker组中,以便airflow可以运行docker作业。

RUN usermod -aG docker airflow

切换到airflow用户

USER airflow

Docker compose文件或命令行参数以运行docker

将docker airflow的docker套接字挂载到刚安装的docker镜像中

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

你现在应该可以运行了!


2
你可以通过将卷附加到你的容器来从你的Airflow docker容器中生成Docker容器。
示例:
docker run -v /var/run/docker.sock:/var/run/docker.sock:ro -v /path/to/bin/docker:/bin/docker:ro your_airflow_image

您可能还需要附加一些Docker所需的库。这取决于您运行Docker的系统。只需在容器内运行Docker命令时读取错误消息,它将指示您需要附加哪些内容。

然后,您的Airflow容器将完全访问在主机上运行的Docker。因此,如果启动Docker容器,它们将在运行Airflow容器的主机上运行。


感谢您的回复。我需要补充一些内容 - 当我有完整的解决方案时,我会追加答案。我正在运行一个运行Ubuntu Xenial的EC2实例。我的Docker容器是在Debian之上构建的。可能是因为这个原因,我不得不在我的Dockerfile中添加一个docker二进制文件并启动守护程序。现在我遇到了权限被拒绝的错误,所以下一步将是将airflow作为用户添加到嵌套的docker实例中,以便它可以触发docker run。 - Ashish Markanday
1
@AshishMarkanday 你可不可以将Docker二进制文件从主机附加到容器中,而不是将其添加到Dockerfile中? - Céline Aussourd
一定要将其添加到主机或其他容器编排系统(如ECS或Kubernetes)中。不要在Docker中运行Docker。 - Davos
这解决了我的问题,我浪费了时间检查我的DockerOperator,但实际上我们需要配置Airflow worker。谢谢。 - UtpMahesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接