Airflow从私有Google容器存储库中提取Docker映像

我正在使用https://github.com/puckel/docker-airflow图片来运行Airflow。我必须添加pip install docker才能支持DockerOperator。

一切似乎都还可以,但是我不知道如何从私有的Google docker容器存储库中提取图像。

我尝试在google cloud conenction的admin部分类型中添加连接,并以docker操作符的身份运行。

    t2 = DockerOperator(
            task_id='docker_command',image='eu.gcr.io/project/image',api_version='2.3',auto_remove=True,command="/bin/sleep 30",docker_url="unix://var/run/docker.sock",network_mode="bridge",docker_conn_id="google_con"
    )

但是总是会出错...

  

[2019-11-05 14:12:51,162] {{taskinstance.py:1047}}错误-没有Docker   提供的注册表URL

我也尝试了docker_conf_option

    t2 = DockerOperator(
            task_id='docker_command',dockercfg_path="/usr/local/airflow/config.json",)

我收到以下错误:

  

[2019-11-06 13:59:40,522] {{docker_operator.py:194}}信息-开始   图片的docker容器   eu.gcr.io/project/image   [2019-11-06 13:59:40,524] {{taskinstance.py:1047}}错误-   (“连接已中止。”,FileNotFoundError(2,“没有此类文件或   目录”))

我还尝试仅使用dockercfg_path =“ config.json”并得到相同的错误。

我不能真正使用Bash Operator尝试登录docker,因为它无法识别docker命令...

我想念什么?

  

第1行:docker:找不到命令

t3 = BashOperator(
                task_id='print_hello',bash_command='docker login -u _json_key - p /usr/local/airflow/config.json eu.gcr.io'
        )
lxd2006121146 回答:Airflow从私有Google容器存储库中提取Docker映像

除了@Tamlyn 的 answer,我们还可以跳过从 docker_conn_id 创建连接 (airflow) 并将其与 gitlab 一起使用

  1. 在您的开发机器上:
  • https://gitlab.com/yourgroup/yourproject/-/settings/repository(在此处创建令牌并获取登录详细信息)
  • docker login registry.gitlab.com(在机器上从机器登录 docker 以将镜像推送到 docker - 出现提示时输入您的 gitlab 凭据)
  • docker build -t registry.gitlab.com/yourgroup/yourproject . && docker push registry.gitlab.com/yourgroup/yourproject(构建并推送到您的项目存储库的容器注册表)
  1. 在您的气流机器上:
  • https://gitlab.com/yourgroup/yourproject/-/settings/repository(您可以使用上面创建的令牌登录)
  • docker login registry.gitlab.com(从机器登录到 docker 以从 docker 拉取镜像,这跳过了创建 docker 注册表连接的需要 - 出现提示时输入您的 gitlab 凭据 = 这将生成 ~/.docker/config.json需要 Reference from docker docs )
  1. 在你的 dag 中:
dag = DAG(
    "dag_id",default_args = default_args,schedule_interval = "15 1 * * *"
)

docker_trigger = DockerOperator(
    task_id = "task_id",api_version = "auto",network_mode = "bridge",image = "registry.gitlab.com/yourgroup/yourproject",auto_remove = True,# use if required
    force_pull = True,# use if required
    xcom_all = True,# use if required
    # tty = True,# turning this on screws up the log rendering
    # command = "",# use if required
    environment = { # use if required
        "envvar1": "envvar1value","envvar2": "envvar2value",},dag = dag,)

这适用于在实例上安装了 Ubuntu 20.04.2 LTSairflow(经过尝试和测试)

,

airflow.hooks.docker_hook.DockerHook使用的docker_default连接没有配置。

现在,您首次尝试将google_con设置为docker_conn_id,并且抛出的错误表明未配置主机( ie 注册表名称)。

这里有几个更改要做:

    image中传递的
  • DockerOperator自变量应设置为image标签,而无需加上registry name前缀。
DockerOperator(api_version='1.21',# docker_url='tcp://localhost:2375',#Set your docker URL
    command='/bin/ls',image='image',network_mode='bridge',task_id='docker_op_tester',docker_conn_id='google_con',dag=dag,# added this to map to host path in MacOS
    host_tmp_dir='/tmp',tmp_dir='/tmp',)
  • 为基础DockerHook提供注册表名称,用户名和密码,以便在您的google_con连接中向Docker进行身份验证。

您可以从a service account key获取用于身份验证的长期凭证。对于用户名,请使用_json_key,然后在密码字段中粘贴json key file的内容。

Google connection for docker

以下是运行任务的日志:

[2019-11-16 20:20:46,874] {base_task_runner.py:110} INFO - Job 443: Subtask docker_op_tester [2019-11-16 20:20:46,874] {dagbag.py:88} INFO - Filling up the DagBag from /Users/r7/OSS/airflow/airflow/example_dags/example_docker_operator.py
[2019-11-16 20:20:47,054] {base_task_runner.py:110} INFO - Job 443: Subtask docker_op_tester [2019-11-16 20:20:47,054] {cli.py:592} INFO - Running <TaskInstance: docker_sample.docker_op_tester 2019-11-14T00:00:00+00:00 [running]> on host 1.0.0.127.in-addr.arpa
[2019-11-16 20:20:47,074] {logging_mixin.py:89} INFO - [2019-11-16 20:20:47,074] {local_task_job.py:120} WARNING - Time since last heartbeat(0.01 s) < heartrate(5.0 s),sleeping for 4.989537 s
[2019-11-16 20:20:47,088] {logging_mixin.py:89} INFO - [2019-11-16 20:20:47,088] {base_hook.py:89} INFO - Using connection to: id: google_con. Host: gcr.io/<redacted-project-id>,Port: None,Schema:,Login: _json_key,Password: XXXXXXXX,extra: {}
[2019-11-16 20:20:48,404] {docker_operator.py:209} INFO - Starting docker container from image alpine
[2019-11-16 20:20:52,066] {logging_mixin.py:89} INFO - [2019-11-16 20:20:52,066] {local_task_job.py:99} INFO - Task exited with return code 0
,

基于最近的 Cloud Composer documentation,建议改用 KubernetesPodOperator,如下所示:

from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator

KubernetesPodOperator(
    task_id='docker_op_tester',name='docker_op_tester',namespace="default",image="eu.gcr.io/project/image",cmds=["ls"]
    )
,

您将需要在包含gcloud命令行工具的工作站中安装Cloud SDK

在安装Cloud SDK和Docker version 18.03或更高版本之后 根据他们的文档从Container Registry中提取,请使用以下命令:

RSACryptoServiceProvider

docker pull [HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG] 

其中:

  • [HOSTNAME]列在控制台中的“位置”下。这是四个之一 选项:gcr.io,us.gcr.io,eu.gcr.io或asia.gcr.io。
  • [PROJECT-ID]是您的Google Cloud Platform Console项目ID。
  • [IMAGE]是容器注册表中的图像名称。
  • [TAG]是应用于图像的标签。在注册表中,标签是唯一的 到图像。
  • [IMAGE_DIGEST]是图像内容的sha256哈希值。在里面 控制台上,单击特定图像以查看其元数据。摘要 列为图像摘要。

要获取特定图像的拉出命令,请执行以下操作:

  1. 单击图像名称以转到特定的注册表。
  2. 在注册表中,选中图像版本旁边的框 你想拉。
  3. 点击页面顶部的SHOW PULL COMMAND。
  4. 复制pull命令,该命令使用 标签或摘要

*还请检查注册表中是否有push and pull permissions

**已将Docker配置为使用gcloud作为凭据助手,或正在使用其他authentication method。要将gcloud用作凭据助手,请运行以下命令:

docker pull [HOSTNAME]/[PROJECT-ID]/[IMAGE]@[IMAGE_DIGEST]
,

我知道问题与GCR有关,但值得注意的是,其他容器注册机构可能期望该配置采用其他格式。

例如,Gitlab希望您将完全限定的映像名称传递给DAG,并仅将Gitlab容器注册表主机名放在连接中:

DockerOperator(
    task_id='docker_command',image='registry.gitlab.com/group/project/image:tag',api_version='auto',docker_conn_id='gitlab_registry',)

设置您的gitlab_registry连接,例如:

docker://gitlab+deploy-token-1234:ABDCtoken1234@registry.gitlab.com
本文链接:https://www.f2er.com/3150896.html

大家都在问