除了@Tamlyn 的 answer,我们还可以跳过从 docker_conn_id
创建连接 (airflow
) 并将其与 gitlab
一起使用
- 在您的开发机器上:
-
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
(构建并推送到您的项目存储库的容器注册表)
- 在您的气流机器上:
-
https://gitlab.com/yourgroup/yourproject/-/settings/repository
(您可以使用上面创建的令牌登录)
-
docker login registry.gitlab.com
(从机器登录到 docker 以从 docker 拉取镜像,这跳过了创建 docker 注册表连接的需要 - 出现提示时输入您的 gitlab 凭据 = 这将生成 ~/.docker/config.json
需要 Reference from docker docs )
- 在你的 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 LTS
的 airflow
(经过尝试和测试)
,
airflow.hooks.docker_hook.DockerHook
使用的docker_default
连接没有配置。
现在,您首次尝试将google_con
设置为docker_conn_id
,并且抛出的错误表明未配置主机( ie 注册表名称)。
这里有几个更改要做:
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的内容。
以下是运行任务的日志:
[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哈希值。在里面
控制台上,单击特定图像以查看其元数据。摘要
列为图像摘要。
要获取特定图像的拉出命令,请执行以下操作:
- 单击图像名称以转到特定的注册表。
- 在注册表中,选中图像版本旁边的框
你想拉。
- 点击页面顶部的SHOW PULL COMMAND。
- 复制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