Airflow 从私人谷歌容器存储库中拉取 docker 镜像

Tom*_*nič 5 docker google-container-registry airflow

我正在使用https://github.com/puckle/docker-airflow图像来运行 Airflow。我不得不添加pip install docker它才能支持 DockerOperator。

一切似乎都很好,但我不知道如何从私人 google docker 容器存储库中提取图像。

我尝试在 google cloud conenction 的管理部分类型中添加连接并运行 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"
    )
Run Code Online (Sandbox Code Playgroud)

但是总是报错...

[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",

    )
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

[2019-11-06 13:59:40,522] {{docker_operator.py:194}} 信息 - 从镜像 eu.gcr.io/project/image 启动 docker 容器 [2019-11-06 13:59:40,524] { {taskinstance.py:1047}} 错误 - ('连接中止。', FileNotFoundError(2, '没有这样的文件或目录'))

我也尝试只使用 dockercfg_path="config.json" 并得到同样的错误。

我无法真正使用 Bash Operator 尝试 docker login,因为它无法识别 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'
        )
Run Code Online (Sandbox Code Playgroud)

Olu*_*ule 6

airflow.hooks.docker_hook.DockerHook正在使用docker_default未配置的连接。

现在,在您的第一次尝试中,您设置google_condocker_conn_id并且抛出的错误显示未配置主机(注册表名称)。

以下是一些需要做的更改:

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',
    )
Run Code Online (Sandbox Code Playgroud)
  • 为底层提供注册表名称、用户名和密码,DockerHook以在您的google_con连接中对 Docker 进行身份验证。

您可以从服务帐户密钥中获取用于身份验证的长期凭据。对于用户名,使用_json_key和 在密码字段中粘贴json 密钥文件的内容。

docker 的 Google 连接

以下是运行我的任务的日志:

[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
Run Code Online (Sandbox Code Playgroud)