Создание переменных из конвейерных команд, содержащих одинарные кавычки

Я пытаюсь связать различные команды, чтобы автоматизировать общий процесс докера. Это не докер, это скорее попытка автоматизировать это в bash.

Я могу бегать:

docker ps | grep manager | cut -f -d ' '

Который перечисляет текущие контейнеры докеров, выделяет тот, который содержит слово «менеджер», а затем захватывает первое поле, которое является идентификатором контейнера, например, 3a5455f3ac72

Затем я могу запустить:

docker inspect -f'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} 3a5455f3ac72

Который получает IP-адрес док-контейнера, например, 172.18.0.4

Чего я хотел бы добиться, так это переменной с именем container_id и переменной с именем container_IP, которые я могу использовать в сценариях bash. Я пытался:

container_id = "docker ps | grep manager | cut -f 1 -d ' '"
container_ip='docker inspect -f'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $container_id'

Но когда я пытаюсь создать переменную container_id, я получаю:

invalid argument "1" for "-f, --filter" flag: bad format of filter (expected name=value)
See 'docker ps --help'.

Я думаю, что у меня есть ошибка в том, как я использую одинарные/двойные кавычки, но я не могу понять, где я ошибаюсь.

Вы можете использовать замены процессов, например. container_id = "$(docker ps | ...)", вместо буквальных строк для установки ваших переменных

Fravadona 20.11.2022 02:24

Сохранение команд в переменных работает не очень хорошо; по сути, переменные предназначены для хранения данных, а не исполняемого кода. Вместо этого для хранения кода вам обычно нужна функция. См. BashFAQ #50: «Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!»

Gordon Davisson 20.11.2022 02:25

Во-первых, IP-адрес docker inspect почти бесполезен; он доступен только на одной конкретной настройке ОС хоста, и то только с того же хоста. Вы хотите вместо этого использовать опубликованный порт, который будет более переносимым и может вообще не требовать никаких docker команд?

David Maze 20.11.2022 02:26

@Fravadona Это замена команды. Замена процесса использует <(...) в качестве разделителей и действует как имя файла, содержимое которого поступает из стандартного вывода прилагаемой команды.

chepner 20.11.2022 02:46

Почему $container_id' заканчивается одинарной кавычкой? Есть ли другие линии?

Maximilian Ballard 20.11.2022 03:48

Вместо того, чтобы использовать docker ps для захвата container_id, почему бы не дать ему какое-нибудь известное имя, используя опцию -name при запуске вашего контейнера, а затем использовать это имя в команде inspect

anubhava 20.11.2022 05:37

Спасибо @anubhava - это многое упростило, и это работает. Хотя я постараюсь провести рефакторинг, основываясь на том, что сказал Гордон — код помещается в функции, а данные — в переменные.

MLD 20.11.2022 12:40
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
0
7
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код может выглядеть следующим образом:

container_id() {
   docker ps -f 'name=manager' --format '{{.ID}}'
}
container_ip() {
   local id
   id=$(container_id)
   docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$id"
}

container_ip
ошибка в том, как я использую одинарные/двойные кавычки

Цитаты здесь не причем. Не храните команды в виде строк. Используйте функции для хранения команд. Не забудьте проверить свои скрипты с помощью shellcheck. Также смотрите http://mywiki.wooledge.org/BashFAQ/050 .

Создание переменных из конвейерных команд, содержащих одинарные кавычки

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

container_id=$(docker ps | grep manager | cut -f 1 -d ' ')
container_ip=$(docker inspect -f'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container_id")
echo "$container_ip"

Первый конвейер команд, вероятно, следует преобразовать в одну команду docker ps -q --filter '...'; это должно улучшить как производительность, так и точность.

tripleee 20.11.2022 11:40

Спасибо за отличный ответ, который сработал для моего варианта использования. Затем я добавил sed -i 's/MANAGER_IP/'"$container_ip"'/g' file.txt, чтобы заменить общий заполнитель в файле.txt для идентификатора контейнера фактическим IP-адресом.

MLD 21.11.2022 21:53

Другие вопросы по теме