我在EC2实例上运行了Airflow,并且安排了一些任务来启动Docker容器。我该如何做?我需要在我的Airflow容器中安装Docker吗?接下来的步骤是什么?我有一个yaml文件用于启动容器,它派生自puckel/airflow Docker镜像。
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
最终解决方案
我的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
你现在应该可以运行了!
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容器的主机上运行。