Все, что содержит пробелы, в кавычках или нет, разбивается на отдельные аргументы для Rscript
(или docker run
?) И, таким образом, терпит неудачу. что цитирование Azure делает на бэкэнде с --startup-file
, потому что все зарегистрированные docker run
выглядят нормально. С одной стороны, Azure, кажется, цитирует слишком много (что приводит к строкам), но с другой стороны, недостаточно (потому что пробелы по-прежнему разбивают материал). Фон
Я предполагаю, что --startup-file
может фактически содержать произвольные команды оболочки (а не только исполняемые файлы), потому что:
- Это по-разному описывается как «Запуск Команда » и «Запуск Файл » на
portal.azure.com
. - Согласно журналам, он просто добавляется к
docker run
как [COMMAND]
и, следовательно, должен придерживаться той же семантики. - Это работает (если нет пробелов).
Я знаю, что основная проблема заключается в эти аргументы оболочки разделены пробелами, но, как показано ниже, простые "
этого не делают.
Я использую 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
пустым, но ) что было бы громоздко для простых вариантов и б) это должно быть возможно .