当前位置: 首页 > 知识库问答 >
问题:

如何从本身在 docker 容器中运行的气流运行 docker 操作员任务?

公西马鲁
2023-03-14

我的 Windows 机器上运行了一个 docker 容器,它是使用官方文档中提供的 docker-compose 文件的改编版本构建的。

这工作得很好,但是我想将python脚本(我的任务)从已挂载的plugins文件夹中移动到它们自己的docker容器中。

为了测试这一点,我创建了一个简单的“Hello World!”示例-脚本:

import numpy as np

def main():
    print(f'Hello World')
    print(np.random.random((3, 3)))
 
if __name__ == '__main__':
    main()

它与以下简单的docker文件一起

FROM python:3.9

ADD main.py .
RUN pip install numpy

CMD ["python", "./main.py"]

我可以用< code > docker build-t docker-test-image创建我的映像。使用< code > docker run-name docker-test-container docker-test-image 从CLI运行此命令,将得到预期的输出:

Hello World
[[0.20923763 0.25415024 0.95603957]
 [0.01320074 0.58392589 0.24175036]
 [0.06431375 0.87276564 0.9912474 ]]

到目前为止还不错,但是如果我用docker操作员触发DAG,它会失败,我会得到几个

FileNotFoundError:[Errno 2]日志中没有此类文件或目录错误。

我的DAG脚本如下所示:

from airflow import DAG
from airflow.utils.dates import days_ago
from airflow.providers.docker.operators.docker import DockerOperator
from datetime import timedelta

with DAG(
    dag_id= 'docker_test_dag',
    description='Testing the docker operator',
    schedule_interval=None,
    start_date=days_ago(2),
    catchup=False,
    tags=['docker_test'],
    default_args={
        'owner': 'airflow',
        'email': ['airflow@example.com'],
        'email_on_failure': False,
        'email_on_retry': False,
        'retries': 0,
        'depends_on_past': False,
        'retry_delay': timedelta(minutes=5)
    }
) as dag:

    docker_test_task = DockerOperator(
        task_id='docker_test_task',
        image='docker-test-image',
        api_version='auto',
        auto_remove=True,
        mount_tmp_dir=False,
        container_name='docker-test-container',
        command='echo "this is a test message shown from within the container',
        docker_url='unix://var/run/docker.sock',
        network_mode='bridge'
    )

    docker_test_task

在仔细研究了一下之后,我认为这是一个Docker-in-Docker问题,最有可能的解决方案是在本教程中找到的。我添加了-/var/run/docker.sock:/var/run/docker。sock</code>添加到我的airflow docker compose文件中的volumes部分。否,DAG仍然失败,并出现以下日志错误:

回溯(最近一次调用):文件“/home/arflow/.local/lib/python3.7/site-packages/requests/adapters.py”,第450行,在发送超时=超时文件“/hame/arflows/.local/lib/ppython3.7/site-packages/urllib3/connectionpool.py”中,第786行,在urlopen方法中,url,error=e,_pool=self,_stacktrace=sys。exc_info()2文件“/home/arflow/.local/lib/python3.7/site-packages/urllib3/util/retry.py”,第550行,增量增加6。reraise(type(error),error,_stacktrace)文件“/home/afflow/.local/lib/python3.7/site-packages/urllib3/packages/six.py”,第769行,在reraise-raise提升值中。with_traceback(tb)文件“/home/arflow/.local/lib/python3.7/site packages/urllib3/connectionpool.py”,第710行,位于urlopen chunked=chunked中,文件“/hame/arflows/.local/lib/ppython3.7/site packages/urllib3/onnectionpool.py”第398行,位于_make_request conn.request(方法,url,**httplib_request_kw)文件“/usr/local/lib/python3.7/http/client.py”的第1281行,位于请求自身中_send_request(method,url,body,headers,encode_chunked)文件“/usr/local/lib/python3.7/http/client.py”,第1327行,位于_send_request self中。endheaders(body,encode_chunked=encode_chonked)文件“/usr/local/lib/python3.7/http/client.py”,第1276行,位于endheaders-self中_send_output(message_body,encode_chunked=encode_chonked)文件“/usr/local/lib/python3.7/http/client.py”,第1036行,在_send_output self中。send(msg)文件“/usr/local/lib/python3.7/http/client.py”,第976行,在send-self中。connect()文件“/home/arflow/.local/lib/python3.7/site packages/docker/transport/unixconn.py”,第30行,位于connect sock.connect(self.unix_socket)urllib3.exceptions中。ProtocolError:(“连接已中止。”,PermissionError(13,“权限被拒绝”))

在处理上述异常期间,发生了另一个异常:

回溯(最近一次调用的最后一次):文件“/home/arflow/.local/lib/python3.7/site-packages/docker/api/client.py”,第214行,在_retrieve_server_version中返回self。version(api_version=False)[“ApiVersion”]文件“/home/arflow/.local/lib/python3.7/site-packages/docker/api/demon.py”,第181行,在版本中返回self._result(self_get(url),json=True)文件“/hame/arflows/.local/python370/site-ppackages/docker/utils/decorators.py”,第46行,在内部返回f(self,*args,**kwargs)文件“.home/arfrow/.llocal/lib/python3.7/site-packges/docker/api/client.py”,第237行,在_get return self中。get(url,**self.set_request_timeout(kwargs))文件“/home/arflow/.local/lib/python3.7/site-packages/requests/sessions.py”,第542行,在get-return-self中。request('GET',url,**kwargs)文件“/home/arflow/.local/lib/python3.7/site-packages/requests/sessions.py”,第529行,在request resp=self中。send(prep,**send_kwargs)文件“/home/arflow/.local/lib/python3.7/site-packages/requests/sessions.py”,第645行,在send r=适配器中。send(request,**kwargs)文件“/home/arflow/.local/lib/python3.7/site packages/requests/adapters.py”,第501行,在send-raise ConnectionError(err,request=request)requests.exceptions中。ConnectionError:(“连接已中止。”,PermissionError(13,“权限被拒绝”))

在处理上述异常期间,发生了另一个异常:

回溯(最近一次调用):文件 “/home/airflow/.local/lib/python3.7/site-packages/airflow/providers/docker/operator/docker.py”,第 360 行,在 execute self.cli = self._get_cli() 文件 “/home/airflow/.local/lib/python3.7/site-packages/airflow/providers/docker/operator/docker.py”,第 390 行,_get_cli返回 APIClient(base_url=self.docker_url, version=self.api_version, tls=tls_config) 文件 “/home/airflow/.local/lib/python3.7/site-packages/docker/api/client.py”, 第 197 行,在 init self._version = self._retrieve_server_version() 文件中 “/home/airflow/.local/lib/python3.7/site-packages/docker/api/client.py”,第 222 行,在 _retrieve_server_version f'获取服务器 API 版本时出错:{e}' docker.errors.DockerException: 获取服务器 API 版本时出错:(“连接中止”,PermissionError(13,“权限被拒绝”))

这应该怎么做?


共有1个答案

贺宏逸
2023-03-14

终于找到了答案:

在docker-compse文件中,而不是

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

在 Windows 机器上使用它:

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

小变化,我想大影响。

 类似资料:
  • 我正在评估我当前的气流部署从Celery executor到Kubernetes(K8s)executor的迁移,以利用Pods提供的资源动态分配和任务隔离。 我很清楚,我们可以使用本机的KubernetesPodOperator通过K8s Executor在K8s集群上运行任务。但是,我找不到关于K8s executor与其他操作符(如bash和Athena)之间兼容性的信息。 这里的问题是,是

  • 问题内容: 我正在研究Centos7。我有一个运行Jenkins的Docker容器。在那个Jenkins容器中,我必须构建并运行其他Docker容器。但是詹金斯不认识码头工人。我能够执行一个shell并将docker安装在容器中。但是,是否有可能让容器在主机上使用我的docker- engine?如何使用? 在Jenkins-(docker)-容器中安装Docker的最佳选择是什么? 问题答案:

  • 问题内容: 我试图在docker容器中运行cron作业 但对我没有用 我的容器只有cron.daily和cron.weekly文件 crontab,cron.d,cron.hourly …在我的容器中不存在 crontab -e也无法正常工作 我的容器使用/ bin / bash运行 问题答案: 这是我运行我的cron容器之一的方法。 Dockerfile: crontab.txt entry.s

  • 问题内容: 我正在尝试在调用shell脚本的docker容器中运行cronjob。 昨天我一直在网上搜索和堆栈溢出,但是我找不到真正可行的解决方案。 我怎样才能做到这一点? 编辑: 我已经创建了一个(带注释的)github存储库,上面有一个工作的docker cron容器,该容器以给定的时间间隔调用shell脚本。 问题答案: 您可以将crontab复制到映像中,以使从该映像启动的容器运行该作业。

  • 我创建了一个(有注释的)github存储库,其中有一个工作的docker cron容器,它以给定的时间间隔调用一个shell脚本。

  • 只有当docker容器尚未运行时,我才需要运行它。给了这个命令。如果它不存在,我将如何运行它。 我对任何脚本或语言都持开放态度。