Выполнение '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
Другие вопросы по тегам