Azure пакет windows рабочие нагрузки контейнера удаляют кавычки из предоставленной командной строки - PullRequest
1 голос
/ 04 августа 2020

При использовании windows контейнерных рабочих нагрузок на Azure Пакетные кавычки удаляются из аргументов командной строки, если они не содержат пробела.

Мы используем новейший C# SDK 13.0.0 и узел SKU виртуальных машин windows server 2019 с контейнерами.

Repro: создание задания и задачи, выполняющейся внутри контейнера docker (например, на основе образа docker mcr.microsoft.com/windows/servercore:ltsc2019 ) используйте командную строку cmd /S /C mkdir "c:/foo" - убедитесь, что внутри контейнера docker команда выполняется как cmd /S /C mkdir c:/foo - что не удастся.

Та же проблема описана в этих открытых контейнерах PR: https://github.com/opencontainers/runtime-spec/commit/deb4d954eafc4fc65f04c00a08e08c3e69df32d0

Изменить: я понял, что это было больше как утверждение, чем вопрос ... так что вот вопрос: каков обходной путь / исправление для этого поведения?

Изменить решение powershell -EncodedCommand : Я принял решение для переменной среды, но мы используем другое. Мы используем «https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe?view=powershell-5.1#-encodedcommand-base64encodedcommand» - это скрывает кавычки и обратную косую черту из CommandLineToArgsvW и docker - это означает, что командная строка правильно собирается внутри контейнера docker на azure batch vm. (В C# это делается var base64EncodedCmd = System.Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(cmd));) Позаботьтесь также о правильном экранировании powershell. например, закодированная команда может быть чем-то вроде "& my.exe --% --input \\\"userprovidedparam\\"" (с использованием команд PowerShell "остановить синтаксический анализ" -%), в противном случае, например, значение $ (Get-Date) будет оценено

1 Ответ

2 голосов
/ 04 августа 2020

Учитывая, что это проблема во время выполнения, потенциальный обходной путь - создать файл .cmd или .bat, содержащий команды, которые вы хотите запустить. Вы можете связать этот файл как ResourceFile или записать его в специальный контейнер.

...