Как выполнить префект Flow на образе докера?

Моя цель:

У меня есть встроенный образ докера, и я хочу запустить все свои потоки на этом образе.

В настоящее время:

У меня есть следующая задача, которая выполняется на Local Dask Executor. Сервер, на котором работает агент, отличается от той среды Python, которая необходима для выполнения my_task, поэтому необходимо запускать образ перед сборкой.

Мой вопрос: Как мне запустить этот поток на Dask Executor, чтобы он работал на образе докера, который я предоставил (в качестве среды)?

import prefect
from prefect import task, Flow
from prefect.engine.executors import LocalDaskExecutor
from prefect.environments import LocalEnvironment


@task
def hello_task():
    logger = prefect.context.get("logger")
    logger.info("Hello, Docker!")


with Flow("My Flow") as flow:
    results = hello_task()

flow.environment = LocalEnvironment(
    labels=[], executor=LocalDaskExecutor(scheduler="threads", num_workers=2),
)

Я подумал, что мне нужно сначала запустить сервер и агент на этом образе докера (как обсуждалось здесь), но я предполагаю, что есть способ просто запустить Flow на предоставленном изображении.

Обновление 1

Следуя этому руководству, Я пробовал следующее:

import prefect
from prefect import task, Flow
from prefect.engine.executors import LocalDaskExecutor
from prefect.environments import LocalEnvironment
from prefect.environments.storage import Docker


@task
def hello_task():
    logger = prefect.context.get("logger")
    logger.info("Hello, Docker!")


with Flow("My Flow") as flow:
    results = hello_task()

flow.storage = Docker(registry_url='registry.gitlab.com/my-repo/image-library')
flow.environment = LocalEnvironment(
    labels=[], executor=LocalDaskExecutor(scheduler="threads", num_workers=2),
)

flow.register(project_name="testing")

Но это создало изображение, которое затем было загружено в предоставленный registry_url. Впоследствии, когда я попытался запустить зарегистрированную задачу, она вытащила вновь созданный образ, и задача застряла в статусе Submitted for execution на несколько минут.

Я не понимаю, почему он подтолкнул изображение, а затем вытащил его? Вместо этого у меня уже есть сборка образа в этом реестре, я хотел бы указать образ, который следует использовать для выполнения задачи.


person Newskooler    schedule 07.10.2020    source источник
comment
В документации это подробно объясняется, например, вот краткое руководство. Если вы используете Prefect Server самостоятельно, вам необходимо убедиться, что контейнер Docker имеет сетевой доступ к вашему серверному API.   -  person chriswhite    schedule 07.10.2020
comment
Я прочитал это, но там упоминается, что registry_url предназначен для отправки в реестр (что меня сбивает с толку). Если вы укажете URL-адрес реестра, образ будет помещен в реестр контейнеров после регистрации потока. Является ли registry_url URL-адресом моего изображения (тот, который я хотел бы запустить)?   -  person Newskooler    schedule 07.10.2020
comment
Образы Docker обычно хранятся в реестрах Docker. Если вы не укажете registry_url, построенный образ будет храниться локально на машине, на которой он был собран.   -  person chriswhite    schedule 07.10.2020
comment
Да, у меня есть образы в реестре (в моем случае GitLab). Почему мне нужно указать ссылку на реестр, а не ссылку на конкретное изображение?   -  person Newskooler    schedule 07.10.2020
comment
Потому что образ еще не создан; если вы хотите указать как имя изображения, так и тег (вместо использования значений по умолчанию Prefect), вы можете сделать это с помощью kwargs image_name и image_tag в хранилище Docker.   -  person chriswhite    schedule 07.10.2020
comment
Думаю, я не слежу. У меня есть встроенный образ в реестре докеров. Например: registry.gitlab.com/my-repo/image-library:v1.3 Затем я хочу запустить свой Flow внутри этого изображения. Для этого мне обычно нужно вытащить образ, затем запустить его, а затем выполнить какую-то команду. Я выполнил шаги по предложенной вами ссылке, и я не понимаю, почему он создает новый образ, который добавляется в мой реестр, а затем извлекает новый образ (вместо того, который я хочу)? Я обновлю вопрос сейчас, для ясности.   -  person Newskooler    schedule 07.10.2020


Ответы (1)


В итоге я достиг этого следующим образом:

  1. Запустите prefect server start на сервере (т.е. не внутри докера). Судя по всему, docker-compose в докере — не очень хорошая идея.
  2. Запустите prefect agent start внутри образа докера
  3. Убедитесь, что потоки доступны для образа докера (например, путем монтирования общего тома между образом и сервером).

Вы можете увидеть источник моего ответа здесь.

person Newskooler    schedule 12.10.2020