передать аргументы в кавычках azure webapp для контейнеров --startup-file - PullRequest
0 голосов
/ 06 августа 2020

Для Azure веб-приложения для контейнеров мне нужно передать кавычки az webapp config set --startup-file. Например, аргумент должен включать пробелы .

TL; DR

  • Это действительно должно работать, потому что --startup-file просто добавляется к docker run как docker [COMMAND].
  • Вложенные кавычки (т.е. --startup-file "Rscript -e '1+1'"), как ни странно, приводят к странным двойным кавычкам внутренних кавычек (R получает [EXPR] в виде строки [1] "1+1").
  • Все, что содержит пробелы, в кавычках или нет, разбивается на отдельные аргументы для Rscript (или docker run?) И, таким образом, терпит неудачу. что цитирование Azure делает на бэкэнде с --startup-file, потому что все зарегистрированные docker run выглядят нормально. С одной стороны, Azure, кажется, цитирует слишком много (что приводит к строкам), но с другой стороны, недостаточно (потому что пробелы по-прежнему разбивают материал).

    Фон

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

    1. Это по-разному описывается как «Запуск Команда » и «Запуск Файл » на portal.azure.com.
    2. Согласно журналам, он просто добавляется к docker run как [COMMAND] и, следовательно, должен придерживаться той же семантики.
    3. Это работает (если нет пробелов).

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

    Я использую Rscript -e "1 + 1" в качестве примера здесь, потому что а) R - мой вариант использования и б) легко увидеть, что идет не так. Rscript - это двоичный для пакетного процесса R, с семантикой, подобной, скажем, sh -c "pwd;ls". Я предполагаю, что аналогичный воспроизводимый пример может быть написан для файлов запуска типа sh -c.

    Ни один из приведенных ниже примеров не запустит http-сервер и, таким образом, выйдет из строя az webapp restart, но с включенным ведением журнала контейнера, легко увидеть, что уже идет не так. (Фактический вариант использования будет Rscript -e "shiny::runApp()", который будет запускать http-сервер.)

    Базовый уровень

    В качестве базового уровня это соответствующий docker run, который отлично работает локально (macOS 10.15.6, Docker версия 19.03.12, сборка 48a66213fe):

    docker run rstudio/r-base:4.0.2-xenial Rscript -e "1 + 1"
    # [1] 2
    # works as expected
    

    Nested Quotes

    az webapp config set --name hello-shiny \
      --startup-file "Rscript -e \"1+2\""
    
    az webapp config set --name hello-shiny \
      --startup-file 'Rscript -e "1+3"' 
    
    az webapp config set --name hello-shiny \
      --startup-file "Rscript -e '1+4'"
    

    Соответствующие docker run для каждого из вышеперечисленных, согласно журналам Azure, выглядит примерно так:

    docker run -d -p 8409:3838 \
      -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=true \
      -e WEBSITE_SITE_NAME=hello-shiny \
      -e WEBSITE_AUTH_ENABLED=False \
      -e PORT=3838 \ 
      -e WEBSITE_ROLE_INSTANCE_ID=0 \
      -e WEBSITE_HOSTNAME=hello-shiny.azurewebsites.net \ 
      -e HTTP_LOGGING_ENABLED=1 \
      rocker/shiny:4.0.2 \
      Rscript -e "1+2" 
    

    (я сбросил несколько -e s). Как уже отмечалось, это действительный вызов docker run. При локальном запуске (см. Выше) он дает, как и ожидалось:

    # [1] 3
    

    Но на Azure вы получаете аргумент в виде символьной строки в R, как показано ниже для каждого вариантов

    # [1] "1+2"
    

    Это странно, потому что предполагает, что azure каким-то образом окружил аргумент другим набором кавычек. Чтобы воспроизвести его локально, вам нужно будет запустить

    docker run rstudio/r-base:4.0.2-xenial Rscript -e "'1+1'"
    # [1] "1+1"
    

    Ясно не то, что я хочу, и (я думаю?) Недокументированное azure поведение.

    No Quotes, No Spaces ( Работает!)

    В таком случае передача аргумента без кавычек (и пробелов) работает:

    az webapp config set --name hello-shiny \
      --startup-file "Rscript -e 1+7"
    

    Дает [1] 8.

    Это неудивительно, потому что оба

    • docker run rstudio/r-base:4.0.2-xenial Rscript -e "1+1" и
    • docker run rstudio/r-base:4.0.2-xenial Rscript -e 1+1 работают,

    потому что обычное цитирование -e [EXPR] здесь не нужен.

    Но отсутствие пробелов, хотя здесь технически возможно, на самом деле не является решением.

    Пробелы, без кавычек (сломано)

    az webapp config set --name hello-shiny \
      --startup-file "Rscript -e 1 + 8"
    

    Выдает только [1] 1 на Azure, как и ожидалось, потому что docker run будет просто обрабатывать все после 1 как отдельный аргумент и, таким образом, игнорировать его.

    Пробелы, все виды цитирования ( Все сломано)

    Итак, нет проблем, можно подумать, я собираюсь избежать этого еще.

    az webapp config set --name hello-shiny \
      --startup-file "Rscript -e '1 + 5'"
    
    az webapp config set --name hello-shiny \
      --startup-file "Rscript -e \"1 + 6\""
    

    Эти и их грустные друзья все уступают:

    # Error: unexpected end of input
    # Execution halted
    

    Это немного странно, потому что это означает, что каким-то образом часть кода R (до + включительно) делает его, хотя и не решающим 5.

    Единственный способ воспроизвести это - запустить

    docker run rstudio/r-base:4.0.2-xenial Rscript -e "1 +" 7
    # Error: unexpected end of input
    # Execution halted
    

    Что здесь происходит?

    Я абсолютно не могу понять, что здесь происходит при цитировании / экранировании Azure. Я либо очень, очень плотный (вероятно), либо Azure делает что-то сверхъестественное и недокументированное (возможно?).

    Как передать аргумент с пробелами как --startup-file на Azure?

    Ps .: Я знаю, что могу избежать всех этих махинаций, просто добавив соответствующую инструкцию CMD к моему Dockerfile и оставив --startup-file пустым, но ) что было бы громоздко для простых вариантов и б) это должно быть возможно .

1 Ответ

0 голосов
/ 07 августа 2020

Нет официального документа, объясняющего, как работает параметр --startup-file, и ограничения. Я могу высказать только свое мнение.

Во-первых, параметру необходимо строковое значение, вы можете получить описание здесь о свойстве appCommandLine. В настоящее время, возможно, это работает только для строки без кавычек. И тогда дело доходит до команды для изображения. Вы даете команде Rscript параметры -e 1+7. В команде docker вы помещаете их в кавычки, например "1 + 7", но когда кавычки go удалены, это должно быть 1+7 без пробелов. Итак, наконец, значение параметра --startup-file равно "Rscript -e 1+7".

Это просто мое личное мнение, только для справки.

...