Выполнение 'bash -c' в команде 'docker exec' - PullRequest
0 голосов
/ 07 мая 2018

Контекст: Я пытаюсь написать ярлык для моего ежедневного использования команды 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 Ответ

0 голосов
/ 07 мая 2018

Это не связано с Docker, но Bash ( Другими словами, часть команды докера работает хорошо, просто 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 счастлив.

Наконец, пример использования:

bash /tmp/dockerize.sh 5b02ab015730 world

Дает

running command: "docker exec -it 5b02ab015730 bash -c "echo Hello, world""
Hello, world
...