передать несколько аргументов сборки в docker через файл - PullRequest
0 голосов
/ 17 марта 2020

Я хотел бы иметь возможность передавать несколько аргументов сборки в файл docker и делать это через файл.
Я нашел решение https://ilhicas.com/2018/11/03/docker-build-with-build-arg-wit-multiple-arguments.html

My build.args файл:

SSH_PRIVATE_KEY="$(< ~/.ssh/mia_key)"
CORE_CONFIG_NAME=staging.yml

так что я делаю сейчас:

$old_IFS=$IFS
IFS=$'\n'
docker build --squash -t automations \
  $(for i in `cat build.args`; do out+="--build-arg $i " ; done; echo $out;out="";IFS=$old_IFS) .

и я получил

unknown flag: --build-arg SSH_PRIVATE_KEY
See 'docker build --help'.

, а

echo $(for i in `cat build.args`; do out+="--build-arg $i " ; done; echo $out;out="";IFS=$old_IFS)

дает то, что я ожидал

--build-arg SSH_PRIVATE_KEY="$(< ~/.ssh/mia_key)" --build-arg CORE_CONFIG_NAME=staging.yml

Я полагаю, что это может быть связано с кавычками, как я звоню

docker build --squash -t automations \
      "--build-arg SSH_PRIVATE_KEY="$(< ~/.ssh/mia_key)" --build-arg CORE_CONFIG_NAME=staging.yml" .

Как я могу решить эту проблему?
Я должен избавиться от цитаты или найти другое решение для передачи аргументов

1 Ответ

0 голосов
/ 17 марта 2020

Не используйте 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}' и список переменных среды, сгенерированных почти автоматически.

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