Docker exec -> разрешение отклонено при выполнении через ssh

Я пытаюсь выполнить команду в контейнере докеров, который работает на удаленном сервере. Я запускаю большинство команд через ssh, и все они работают правильно. Однако эта команда изменяет файл /etc/environment, и я получаю сообщение об ошибке «Отказано в доступе».

Речь идет о команде docker exec container_id echo 'WDS_SOCKET_PORT=XXXXX' >> /etc/environment

  • Если я запускаю команду с хоста докера, она работает
  • Если я запускаю простую команду удаленно, используя ssh user@ip docker exec container_id ls, она работает
  • Если я запущу эту команду удаленно, используя ssh user@ip docker exec container_id echo 'WDS_SOCKET_PORT=XXXXX' >> /etc/environment, я получу sh: 1: cannot create /etc/environment: Permission denied

Я безуспешно пытался добавить параметр -u 0 в команду docker exec.

Я не возражаю против внесения изменений в Dockerfile, так как я могу без проблем убить, удалить или воссоздать этот контейнер.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

ssh user@ip "docker exec  container_id /bin/sh -c 'echo \"WDS_SOCKET_PORT=XXXXX\" >> /etc/environment'"

EDIT: обратите внимание, что вся команда docker должна быть заключена в кавычки. Я считаю, что это связано с тем, что в противном случае ssh мог бы анализировать разные части команды как параметры команды docker. Таким образом, каждая подкоманда четко разграничена.

Я не думаю, что побег кавычек выполнен правильно в вашем ответе, так как терминал остается в ожидании большего ввода. Однако это правда, что это как-то связано с перенаправлением ввода-вывода. Я попытался добавить двойные кавычки "echo 'WDS_SOCKET_PORT=49164' >> /etc/environment" и получил ту же ошибку. Мне удалось заставить его работать с помощью sed, так как он не требует перенаправления ввода-вывода: ssh user@ip docker exec container_id "sed -i '$ a\WDS_SOCKET_PORT=XXXXX' /etc/environment"

raquelhortab 05.04.2022 12:44

Использование sed это хорошее решение для меня, но я оставлю это открытым на случай, если кто-то найдет способ заставить работать перенаправление ввода-вывода, на случай, если кто-то найдет этот вопрос и ему понадобится

raquelhortab 05.04.2022 12:46

ОБНОВЛЕНИЕ: sed не очень хорошее решение, поскольку оно не работает, если файл уже не существует

raquelhortab 05.04.2022 15:53

Извините, я писал этот ответ по памяти, цитирование исправлено.

BMitch 05.04.2022 16:10

Я пытался редактировать, пока вы редактировали, этот новый ответ все еще не работает, но я нашел решение: ssh user@ip "docker exec container_id sh -c 'echo \"WDS_SOCKET_PORT=XXXXX\" > /etc/environment'" Мне нужны кавычки, окружающие команду docker, чтобы команда ssh анализировалась правильно. В противном случае, я думаю, он обнаруживает эхо-часть как параметры команды docker. Я отредактирую ответ, как только SO позволит мне

raquelhortab 05.04.2022 16:15

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

BMitch 05.04.2022 16:20

точно! отсюда и кавычки вокруг команды docker. Я отредактировал ответ, но он ожидает утверждения

raquelhortab 05.04.2022 16:28

не могли бы вы одобрить изменения, чтобы я мог отметить ответ как решение? @BMitch

raquelhortab 05.04.2022 22:23

Другие вопросы по теме