Это не связано с 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