【问题标题】:How to run docker command in this Airflow docker container?如何在这个 Airflow docker 容器中运行 docker 命令?
【发布时间】:2021-07-10 08:04:08
【问题描述】:

我已经按照此处所述使用 docker-compose 设置了 Airflow。 https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html

还有一个气流任务必须像执行 docker 命令一样

BashOperator(
    task_id='my',
    bash_command="""
        docker run ..............
    """,
    dag=dag,
)

这意味着需要 Docker 包in the airflow docker image, but there is not

所以,我尝试构建自己的airflow image based docker installed image。喜欢,

FROM apache/airflow:2.0.1 as airflow-image
SHELL ["/bin/bash", "-o", "pipefail", "-e", "-u", "-x", "-c"]

USER root
RUN apt-get update && apt-get --assume-yes install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
RUN echo $(lsb_release -cs)
RUN echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt-get update
RUN apt-get --assume-yes install docker-ce docker-ce-cli containerd.io

使用上面 Dockerfile 的镜像,安装 docker 就像,

$ whereis docker
docker: /usr/bin/docker /usr/libexec/docker
$ whereis dockerd
dockerd: /usr/bin/dockerd

但是我不能让 docker 守护进程启动,所以气流任务可以执行docker run 命令。

在我看到这个 ENTRYPOINT 并测试了几件事之后, https://github.com/apache/airflow/blob/master/Dockerfile#L535

ENTRYPOINT ["/usr/bin/dumb-init", "--", "/entrypoint"]

我想知道我是否可以启动 docker daemon。

有什么建议吗? 我可以制作一个基于气流:2.0.1 并支持 docker commans 的 docker 映像吗?

【问题讨论】:

    标签: docker dockerfile airflow


    【解决方案1】:

    如果我对您的理解正确,您正在尝试将自定义 Docker 映像作为 Airflow 中的任务运行。 有一个DockerOperator 可用,请参阅示例here。 我认为您尝试做的是将 Docker 托管在 Docker 容器中。这不是必需的,因为 Airflow Docker 容器应该可以访问在您的机器上运行的 Docker。

    因此,如果您运行 Airflow 2.0,请确保在您的 Airflow Docker 容器中安装此 Python 包 apache-airflow-backport-providers-docker。并将其包含在您的 Python DAG 文件中:from airflow.providers.docker.operators.docker import DockerOperator。 然后使用运算符,如下所示:

    dockertask = DockerOperator(
                    task_id='docker_command',
                    image='centos:latest',
                    api_version='auto',
                    auto_remove=True,
                    command="/bin/sleep 30",
                    docker_url="unix://var/run/docker.sock",
                    network_mode="bridge"
            )
    

    【讨论】:

    • 当我从 Airflow(位于由 docker-compose 指令 airflow.apache.org/docs/apache-airflow/stable/start/docker.html 创建的 docker 容器中)运行 dockertask 时,它会以 docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory')) 失败。即使没有正在运行的 docker daemon,DockerOperator 也能运行吗? $ pwd /var/run $ ls docker-ssd.pid lock saslauthd utmp
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多