Могу ли я использовать тома docker в пакетных пулах Azure на основе контейнеров

#docker #docker-volume #azure-batch

#docker #docker-volume #azure-batch

Вопрос:

Сценарий: у меня есть несколько задач, в которых работают DL одни и те же модели dataset . Становится расточительным загружать одно и то же dataset в каждой задаче, поэтому ищите методы, позволяющие сохранять загруженные данные в разных запусках задач, для которых требуется одно и то же dataset .

Я исследовал файлы ресурсов и пакеты приложений, однако, насколько я понимаю, они не соответствуют моим требованиям из-за следующего

  1. Файлы ресурсов загружают данные для каждого запуска задачи и не сохраняются.
  2. Пакеты приложений имеют ограничение квоты (по умолчанию 20). И они не могут быть созданы из контейнера docker.

В соответствии с возможностями тома docker я могу запускать свои задачи с тем же идентификатором тома, и загруженные данные будут сохраняться в виртуальной машине. Поскольку Azure batch напрямую не предоставляет команду «docker run» для запуска контейнера, есть ли какой-либо другой способ указать использование томов для пакетных задач с использованием python SDK?

Можем ли мы использовать «container_run_options» в TaskContainerSettings для упоминания томов docker?

Редактировать

Я попытался указать volume в TaskContainerSettings, но при попытке записи в подключенный путь я получаю ошибку «отказано в разрешении»

 PermissionError: [Errno 13] Permission denied: '/opt/docker/Gy9EKVB728YcVZgn7e2AVuuQ/00000001.jpg'
  

Ответ №1:

Найден способ использования томов docker.

Во-первых: используйте «container_run_options» в TaskContainerSettings, чтобы указать тома docker.

     task_container_settings = batch.models.TaskContainerSettings(
        image_name=image_name,
        container_run_options=f"-v {<volume_id>}:{<path>}"
    )
  

Это смонтирует том в /mnt/docker/volumes с именем <volume_id> и будет доступен в указанном контейнере.

Второе: запустите задачу в области пула и с повышенными правами администратора. Без этого вы получите ошибку разрешения при попытке записи в путь к подключенному тому в контейнере.

 task = batch.models.TaskAddParameter(
                id=task_id,
                command_line=command,
                container_settings=task_container_settings,
                user_identity=batchmodels.UserIdentity(
                    auto_user=batchmodels.AutoUserSpecification(
                        scope=batchmodels.AutoUserScope.pool,
                        elevation_level=batchmodels.ElevationLevel.admin)
                )
            )
  

Это запустит задачу с правами суперпользователя, чтобы контейнер, созданный задачей, имел доступ к подключенному тому.