Не используйте backticks`. Вместо этого используйте $(...)
. Bash хакеры вики устарели, устарел синтаксис .
Не for i in $(cat)
. Используйте while IFS= read -r
l oop. Как читать файл построчно в bash.
Использование bash массивов для правильной кавычки аргументов.
args=()
while IFS= read -r i; do args+=("--build-arg" "$i"); done < build.args
docker build --squash -t automations "${args[@]}" .
В качестве альтернативы вы можете использовать достаточно безопасный обработка printf %q
позволяет правильно экранировать и заключать в кавычки аргументы и использовать подстановку команд, но я советую использовать bash массивы, когда это возможно
docker build --squash -t automations $(while IFS= read -r i; do printf "%q %q " --build-arg "$i"; done < build.args) .
Если вы хотите выполнить подстановку команды $(<...)
, это становится сложнее, потому что для этого нужен полностью разбираемый в оболочке файл. Таким образом, файл должен быть source
d. Затем перебираем переменную окружения и передаем их содержимое должным образом:
docker build --squash -t automations $(
source build.args;
for i in CORE_CONFIG_NAME SSH_PRIVATE_KEY; do
printf "%q %q=%q " --build-arg "$i" "${!i}";
done
) .
Предполагая, что ваш файл хорошо структурирован, вы можете отфильтровать файл для извлечения строк впереди =
, например, как-i sh `sed -n '/=/ enjs/=.*//;p}' и список переменных среды, сгенерированных почти автоматически.