Версия - Bash? - В контексте сборки Docker - PullRequest
0 голосов
/ 05 мая 2020

Какая оболочка и какая версия этой оболочки Docker запускается на этапе сборки контейнера?

То есть - у меня есть Dockerfile со следующей строкой.

RUN /path/to/a/script.bash

Это запускает скрипт на этапе сборки Docker. Однако, когда я создаю Docker, меня сбивают с толку некоторые общие для меня bash идиомы. Например, в моем сценарии есть следующее:

urls=(
http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
http://apache.mirrors.pair.com/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
http://mirror.cc.columbia.edu/pub/software/apache/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
https://mirrors.ocf.berkeley.edu/apache/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
)

и Docker завершается ошибкой во время сборки с

/path/to/a/script.bash: 11: /path/to/a/script.bash: Syntax error: "(" unexpected

Итак, какая оболочка и какая версия этой оболочки Docker, когда он запускает скрипт через RUN. (или почему это неправильный вопрос?)

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Если вы не укажете альтернативную SHELL, RUN команды, которые являются пустой строкой, будут заключены в /bin/sh -c (на Linux). Таким образом, эти две команды эквивалентны:

RUN /path/to/a/script.bash
RUN ["/bin/sh", "-c", "/path/to/a/script.bash"]

То, какая оболочка фактически запускается, является функцией базового образа. Часто это оболочка, реализующая то, что есть в POSIX spe c, и не более того; Образы на основе Alpine вообще не включают более тяжелый GNU Bash, если вы не устанавливаете его явно.

Также обратите внимание, что он отличается от интерпретатора, необходимого для запуска скрипта, который обычно обозначается строка "shebang" #!/bin/sh в верхней части скрипта. Вы можете RUN любой скрипт или исполняемый файл таким способом, если он имеет правильное объявление в верхней части файла. Если строки #! нет вообще, сценарий будет интерпретироваться /bin/sh из базового образа, который, вероятно, не поддерживает расширения Bash (переменные массива, source, .. .).

0 голосов
/ 05 мая 2020

Запустите bash --version в своей docker сборке.

FROM ubuntu:latest

RUN /bin/bash --version

Мой результат:

$ docker build .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM ubuntu:latest
 ---> 1d622ef86b13
Step 2/2 : RUN /bin/bash --version
 ---> Running in c2b2eae0798a
GNU bash, version 5.0.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Removing intermediate container c2b2eae0798a
---> 4acdc3fa30ea 
Successfully built 4acdc3fa30ea

Наконец, я удаляю это временное изображение docker image rm 4acdc3fa30ea.

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