Как правильно отформатировать вложенную команду bash в Dockerfile? - PullRequest
2 голосов
/ 26 октября 2019

ОБНОВЛЕНИЕ: команда недопустима в формате JSON. Docker будет использовать «exec форму» RUN, когда обнаружит действительный массив JSON, в противном случае, если будет обнаружен недопустимый JSON, он вернется к использованию «формы оболочки» RUN.

["bash", "-c", "bash -c 'echo SHLVL: \$SHLVL'"] << \$ is illegal JSON!
* 1005. * Но если я добавлю дополнительные \, то Bash не будет расширять переменные на SHLVL. Вместо этого он печатает SHLVL: $SHLVL. Подробности см. В https://github.com/moby/moby/issues/40140#issuecomment-546638065

Вложенный экземпляр bash увеличивает переменную среды SHLVL (http://tldp.org/LDP/abs/html/internalvariables.html).

Например:

$ echo $SHLVL
1
$ bash -c "echo \$SHLVL"
2
$ bash -c "bash -c 'echo \$SHLVL'"
3

I 'я пытаюсь выполнить эту же команду в моем Dockerfile, но я получаю сообщение об ошибке ( см. это в моих действиях на Github https://github.com/dgroomes/docker-shell-example/commit/20ee36e913729b7cbf7f0e46ffebf359af5cf1a9/checks?check_suite_id=282718710#step:6:20).

Step 3/3 : RUN ["bash", "-c", "bash -c 'echo SHLVL: \$SHLVL'"]
 ---> Running in 2255c65b43c9
/bin/sh: 1: [bash,: not found

Является ли проблема с побегом персонажакомбинация Dockerfile + Bash?

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Экранирование символа является «проблемой» в том смысле, что в данном примере это не нужно.

Попробуйте этот Dockerfile и посмотрите объяснение в аналогичном вопросе: Экземпляры Bash не вложены в Dockerfile`RUN`

FROM debian:10
RUN ["bash", "-exc", "bash -exc 'echo SHLVL: $SHLVL'"]
RUN ["bash", "-exc", ":; bash -exc ':; echo SHLVL: $SHLVL'"]

Так почему экранирование здесь не нужно: в первом варианте внешний bash выполняет команду:

bash -exc 'echo SHLVL: $SHLVL'

из-за использования одинарных кавычек, не нужно убегать. Следуйте расширению переменных с помощью параметра x для bash и проверьте вывод сборки Dockerfile:

Sending build context to Docker daemon  14.85kB
Step 1/3 : FROM debian:10
 ---> 8e9f8546050d
Step 2/3 : RUN ["bash", "-exc", "bash -exc 'echo SHLVL: $SHLVL'"]
 ---> Running in 07aaddefac26
+ bash -exc 'echo SHLVL: $SHLVL'
SHLVL: 1
+ echo SHLVL: 1
Removing intermediate container 07aaddefac26
 ---> e82b3fc4b569
Step 3/3 : RUN ["bash", "-exc", ":; bash -exc ':; echo SHLVL: $SHLVL'"]
 ---> Running in 1257c43b276d
+ :
+ bash -exc ':; echo SHLVL: $SHLVL'
+ :
+ echo SHLVL: 2
SHLVL: 2
Removing intermediate container 1257c43b276d
 ---> cfa749c16631
Successfully built cfa749c16631
Successfully tagged test:latest
0 голосов
/ 26 октября 2019

В вашем контейнере не установлен bash, вместо этого используйте sh -c для запуска вашей команды. Тем не менее, большинство выглядит так, как будто контейнер уже запускает /bin/sh для ваших команд. Это означает, что достаточно запустить echo SHLVL: \$SHLVL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...