Как использовать оператор ">>" в Docker?

Я пытаюсь добавить строку в файл в Docker-контейнере, используя docker exec, Тем не менее, он, похоже, неправильно интерпретирует оператор ">>"

 sudo docker exec --interactive mycontainer cat /etc/postfix/main.cf

возвращается

smtpd_banner = $myhostname ESMTP $mail_name (Debian)
biff = no
append_dot_mydomain = no
readme_directory = no

# Basic configuration
# myhostname =
...

Но

sudo docker exec --interactive mycontainer echo "my new line" >> /etc/postfix/main.cf

возвращается -bash: /etc/postfix/main.cf: No such file or directory

В любом случае есть способ передать оператор ">>" в docker-exec, или есть другая команда для добавления строки в файл (что было бы хорошо, но я не смог найти ту, которая была бы родной, потому что контейнеры не имеют каких-либо модных библиотек).

У кого-нибудь есть подвох?

1 ответ

Решение

Вы запускаете команду sudo в оболочке, и она интерпретирует >> до того, как он достигнет sudo или док-клиента. Вам нужно экранировать или заключать в кавычки символы, чтобы ваша собственная оболочка не интерпретировала их, а затем вам нужно запустить оболочку внутри контейнера докера, чтобы интерпретировать их:

sudo docker exec -i mycontainer \
  /bin/sh -c 'echo "my new line" >> /etc/postfix/main.cf'

Чтобы передать переменные из внешней оболочки внутрь контейнера, вы не сможете использовать одинарные кавычки. Вы можете использовать двойные кавычки и экранировать все, что хотите передать во внутреннюю оболочку.

sudo docker exec -i mycontainer \
  /bin/sh -c "echo \"$host_var \$container_var\" >> /etc/postfix/main.cf"
Другие вопросы по тегам