Выполнение 'bash -c' в команде 'docker exec'
Контекст: я пытаюсь написать ярлык для моего ежедневного использования docker exec
команда. По некоторым причинам я экспериментирую с проблемой, что мой вывод иногда прерывается, когда я использую консоль bash внутри контейнера (история испортилась, строки перезаписывают друг друга, когда я пишу,...)
Я прочитал здесь, что вы можете решить эту проблему, добавив некоторую команду перед запуском консоли bash.
Вот соответствующая выдержка из того, что делает мой скрипт
#!/bin/bash
containerHash=$1
commandToRun='bash -c "stty cols $COLUMNS rows $LINES && bash -l"'
finalCommand="winpty docker exec -it $containerHash $commandToRun"
echo $finalCommand
$finalCommand
Вот вывод, который я получаю:
winpty docker exec -it 0b63a bash -c "stty cols $COLUMNS rows $LINES && bash -l"
cols: -c: line 0: unexpected EOF while looking for matching `"'
cols: -c: line 1: syntax error: unexpected end of file
Я прочитал здесь, что это было связано с разбором и расширением. Тем не менее, я не могу использовать функцию или eval
команда (или, по крайней мере, мне не удалось заставить его работать).
Если я выполняю первую строку вывода непосредственно в моем терминале, она работает без проблем.
Как я могу преодолеть эту проблему?
1 ответ
Это не связано с Docker, но Bash (Другими словами, часть команды docker'а работает хорошо, просто bash ворчит на контейнер, как если бы он ворчал на вашем хосте):
Минимальная воспроизводимая ошибка
cmd='bash -c "echo hello"'
$cmd
hello": -c: line 0: unexpected EOF while looking for matching `"'
hello": -c: line 1: syntax error: unexpected end of file
исправлять
cmd='bash -c "echo hello"'
eval $cmd
hello
Ответ
foo='docker exec -it XXX bash -c "echo hello"'
eval $foo
Это позволит вам выполнить вашу команду echo hello
в вашем контейнере, теперь, если вы хотите добавить динамические переменные в эту команду (например, echo $string
) вам просто нужно избавиться от одинарных кавычек для двойных, чтобы это работало, вам нужно будет избегать внутренних двойных кавычек:
foo="docker exec -it $container bash -c \"echo $variable\""
Полный пример
FOO="Hello"
container=$1
bar=$2
cmd="bash -c \"echo $FOO, $bar\""
final_cmd="docker exec -it $container $cmd"
echo "running command: \"$final_cmd\""
eval $final_cmd
Давай займемся временем, чтобы покопаться,
$FOO
является статической переменной, в нашем случае она работает точно так же, как обычная переменная, просто чтобы показать вам.$bar
динамическая переменная, которая принимает второй аргумент командной строки в качестве значения- Так как
$cmd
а также$final_cmd
использует только двойные кавычки, переменные интерпретируются - Потому что мы используем
eval $final_cmd
Команда хорошо истолкована, Баш счастлив.
Наконец, пример использования:
bash /tmp/dockerize.sh 5b02ab015730 world
дает
running command: "docker exec -it 5b02ab015730 bash -c "echo Hello, world""
Hello, world