我正在使用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',
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",
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'
)
答案 0 :(得分:3)
除了@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_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
(经过尝试和测试)
答案 1 :(得分:1)
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的内容。
以下是运行任务的日志:
[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
答案 2 :(得分:1)
基于最近的 Cloud Composer documentation,建议改用 KubernetesPodOperator
,如下所示:
from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator
KubernetesPodOperator(
task_id='docker_op_tester',
name='docker_op_tester',
dag=dag,
namespace="default",
image="eu.gcr.io/project/image",
cmds=["ls"]
)
答案 3 :(得分:0)
您将需要在包含gcloud命令行工具的工作站中安装Cloud SDK。
在安装Cloud SDK和Docker version 18.03或更高版本之后 根据他们的文档从Container Registry中提取,请使用以下命令:
RSACryptoServiceProvider
或
docker pull [HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]
其中:
要获取特定图像的拉出命令,请执行以下操作:
*还请检查注册表中是否有push and pull permissions。
**已将Docker配置为使用gcloud作为凭据助手,或正在使用其他authentication method。要将gcloud用作凭据助手,请运行以下命令:
docker pull [HOSTNAME]/[PROJECT-ID]/[IMAGE]@[IMAGE_DIGEST]
答案 4 :(得分:0)
我知道问题与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