Я пытаюсь выполнить команду в контейнере докеров, который работает на удаленном сервере. Я запускаю большинство команд через 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, так как я могу без проблем убить, удалить или воссоздать этот контейнер.
Ошибка исходит не от докера или ssh, она исходит от вашей оболочки, которая анализирует команду, которую вы хотите запустить. Вы пытаетесь изменить файл на своем хосте. Чтобы сделать перенаправление ввода-вывода внутри контейнера, вам нужно запустить там оболочку и разобрать команду с этой оболочкой.
ssh user@ip "docker exec container_id /bin/sh -c 'echo \"WDS_SOCKET_PORT=XXXXX\" >> /etc/environment'"
EDIT: обратите внимание, что вся команда docker должна быть заключена в кавычки. Я считаю, что это связано с тем, что в противном случае ssh мог бы анализировать разные части команды как параметры команды docker. Таким образом, каждая подкоманда четко разграничена.
Использование sed это хорошее решение для меня, но я оставлю это открытым на случай, если кто-то найдет способ заставить работать перенаправление ввода-вывода, на случай, если кто-то найдет этот вопрос и ему понадобится
ОБНОВЛЕНИЕ: sed не очень хорошее решение, поскольку оно не работает, если файл уже не существует
Извините, я писал этот ответ по памяти, цитирование исправлено.
Я пытался редактировать, пока вы редактировали, этот новый ответ все еще не работает, но я нашел решение: ssh user@ip "docker exec container_id sh -c 'echo \"WDS_SOCKET_PORT=XXXXX\" > /etc/environment'"
Мне нужны кавычки, окружающие команду docker, чтобы команда ssh анализировалась правильно. В противном случае, я думаю, он обнаруживает эхо-часть как параметры команды docker. Я отредактирую ответ, как только SO позволит мне
Когда вы добавляете ssh
, вероятно, к синтаксическому анализу добавляется еще одна оболочка, сначала оболочка на вашем хосте, затем оболочка на хосте, к которому вы подключились по ssh, а затем оболочка внутри контейнера. Вы должны быть уверены, что только последняя оболочка видит >>
.
точно! отсюда и кавычки вокруг команды docker. Я отредактировал ответ, но он ожидает утверждения
не могли бы вы одобрить изменения, чтобы я мог отметить ответ как решение? @BMitch
Я не думаю, что побег кавычек выполнен правильно в вашем ответе, так как терминал остается в ожидании большего ввода. Однако это правда, что это как-то связано с перенаправлением ввода-вывода. Я попытался добавить двойные кавычки
"echo 'WDS_SOCKET_PORT=49164' >> /etc/environment"
и получил ту же ошибку. Мне удалось заставить его работать с помощью sed, так как он не требует перенаправления ввода-вывода:ssh user@ip docker exec container_id "sed -i '$ a\WDS_SOCKET_PORT=XXXXX' /etc/environment"