繁体   English   中英

如何将来自 AWS ECR 的私有镜像与 Airflow 的 DockerOperator 一起使用?

[英]How to use a private image from AWS ECR with Airflow's DockerOperator?

我使用 CLI(使用 Click 构建)创建了自定义 package。 这个 package 可以做两件事:运行预处理和运行机器学习 model。我创建了这个客户 package 的 Docker 图像并将其推送到 AWS (ECR) 上的私有注册表。

现在我想用 Airflow 运行这个容器,我想在 EC2 实例上运行它。 我用 docker-compose 运行它。

对于这个例子,我将只关注一项任务:运行容器进行预处理。

但是,现在我得到 t2 的“上游失败”。

from datetime import timedelta
import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.docker_operator import DockerOperator


default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': airflow.utils.dates.days_ago(1),
    'email': ['airflow@example.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5)
}

dag = DAG(
    'example_pipeline',
    default_args=default_args,
    description='example data pipeline.',
    schedule_interval=timedelta(minutes=3)
)


t1 = BashOperator(
    task_id='starting_airflow',
    bash_command='echo "Starting Airflow DAG..."',
    dag=dag,
)


t2 = DockerOperator(
    task_id='data_pipeline',
    image='XXXXXXXX.dkr.ecr.eu-central-1.amazonaws.com/rwg:latest',
    container_name='task__export_data',
    command="run-preprocessing",
    network_mode="bridge",
    api_version="auto",
    docker_url="unix://var/run/docker.sock",
    docker_conn_id='aws_con',
    dag=dag
)

t1 >> t2

我通过 UI 创建了“aws_con”。 但这似乎不起作用。

此外,这是我的 docker-compose.yml 文件。

version: '3'
services:
  postgres:
    image: postgres:9.6
    environment:
      - POSTGRES_USER=airflow
      - POSTGRES_PASSWORD=airflow
      - POSTGRES_DB=airflow
    ports:
      - "5432:5432"
    volumes:
      - ./pgdata:/var/lib/postgresql/data

  webserver:
    build: .
    restart: always
    depends_on:
      - postgres
    environment:
      - LOAD_EX=n
      - EXECUTOR=Local
      - FERNET_KEY=jsDPRErfv8Z_eVTnGfF8ywd19j4pyqE3NpdUBA_oRTo=
    volumes:
      - ./dags:/usr/local/airflow/dags
    ports:
      - "8080:8080"
    command: webserver
    healthcheck:
      test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
      interval: 30s
      timeout: 30s
      retries: 3

关于 Docker 操作员,我做错了什么?

第二个问题:如何通过代码或 cli 创建这个“aws_con”?

您应该指定 docker 连接。

这是在 Airflow 和 Docker 中传递凭据的标准方式,Docker 有一个专用的 Docker 连接,您可以在 Airlfow DB 或 Secrets 中定义该连接,并将连接的 ID 作为docker_conn_id - 参数传递给 DockerOperator(您也可以在那里指定 url你不需要在你的运营商中传递 docker_url )。

请在此处查看 Python API:

https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/_api/airflow/providers/docker/operators/docker/index.html

以及关于 Docker 连接的单独页面( docker_conn_id描述链接到此页面):

https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/connections/docker.html#howto-connection-docker

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM