Удалите «старые» файлы конфигурации докера с подстановочными знаками и одной командой - PullRequest
0 голосов
/ 28 декабря 2018

В настоящее время я работаю с файлами конфигурации докера и ищу способ автоматизировать удаление «старого» файла конфигурации.Я использую скрипт, который обновит все мои файлы конфигурации с +1;

app1-config-file-1.2.1
app1-config-file-1.2.2
app1-config-file-1.2.3

и т. Д. И т. Д.

Теперь я хотел бы удалить app1-config-file-1.2.2 при создании app1-config-file-1.2.3.

Эта команда приближает меня;

docker config rm $(docker config ls | grep -e 'app1'.*'-1.2.2')

Где 'app1' - это префикс, а '-1.2.2' - это версия, которую я хочу удалить.

Дело в том, что указанная выше команда удаляет правильную конфигурацию, но она также пытается удалить следующие 'конфиги'

Error response from daemon: access denied
Error: No such config: hours
Error: No such config: ago
Error response from daemon: access denied
Error: No such config: hours
Error: No such config: ago

Что и происходитВернемся к моему запросу: $ (docker config ls | grep -e 'app1'. * '- 1.2.2')

Я попытался добавить --quiet или -q, чтобы получить только идентификаторы конфигурации.Но по какой-то причине я не могу использовать его с конфигурационными файлами так, как он работает с контейнером.

docker config ls -q | grep -e 'app1'.*'-1.2.2'

ничего не дает.

docker config ls | grep -e 'app1'.*'-1.2.2'

приводит к списку с идентификатором, именами конфигурационных файлов, возрастом и т. Д. В основном все файлы конфигурации, которые я хотел бы удалить, но мне просто нужны идентификаторы

Итак, мой вопрос,Как правильно получить идентификаторы определенного файла конфигурации докера при использовании подстановочных знаков?

Спасибо

1 Ответ

0 голосов
/ 28 декабря 2018

Когда вы пишете

docker config rm $(docker config ls | grep -e 'app1'.*'-1.2.2')

Это делает три вещи:

  1. Выполнить docker config ls, создавая его форматированный вывод.
  2. Filter (grep), которые выводятся только в строки, содержащие app1...-1.2.2.
  3. Передать результирующий вывод, разделенный на слова, в качестве аргументов docker config rm.

Вызов ... | grep is "тупой "в том смысле, что он ничего не знает, в частности о вводе, который он имеет, он просто знает, что это строки текста, и он должен попытаться отфильтровать его.

Лучшим вариантом здесь является более прямойрасскажите docker config ls, что вы ищете. Эта команда принимает параметр --filter;это несколько недокументировано, но если вы знаете точное имя объекта конфигурации, вы можете объединить его с --quiet, чтобы сказать Docker (не оболочке) сначала выполнить фильтрацию к определенному объекту конфигурации, а затем только распечатать его ID.

docker config rm $(docker config ls -f name=app1-config-file-1.2.2 -q)
# But really this is the same as
docker config rm app1-config-file-1.2.2

"Оболочечный" способ - использовать другой инструмент для очистки отформатированного вывода.Примеры в документации Docker показывают идентификатор конфигурации в качестве первого столбца, разделенного пробелами, поэтому вы можете использовать awk (1), например

docker config ls | \
grep 'app1.*-1.2.2' | \
awk '{ print $1 }' \
xargs docker config rm

(Otherинструменты работают и здесь, лично я бы использовал sed (1), но в ответе SO это сложнее объяснить.)

...