Вопрос или проблема
У меня есть оболочечный скрипт на хосте, который вызывает другой скрипт для выполнения внутри контейнера. Вот простой пример, который работает нормально:
host_script.sh
#!/bin/sh
results=$(docker exec mycontainer "./scripts/container_script.sh")
echo $results
container_script.sh
#!/bin/sh
echo "Hello World"
Однако теперь я хотел бы выполнить скрипт контейнера с входным аргументом. Вот так:
host_script.sh
#!/bin/sh
path="/some/other/path"
results=$(docker exec mycontainer "./scripts/container_script.sh $path")
echo $results
container_script.sh
#!/bin/sh
echo "Hello World"
echo $1
На этот раз я получаю ошибку:
OCI runtime exec failed: exec failed: unable to start container process: exec: “./scripts/container_script.sh /some/other/path”: stat ./scripts/container_script.sh /some/other/path: no such file or directory: unknown
Как я могу передать аргумент в этот скрипт внутри контейнера?
Ответ или решение
Чтобы успешно выполнить сценарий host_script.sh
на хосте, передавая аргумент в сценарий внутри контейнера Docker, важно обратить внимание на правильное форматирование команды docker exec
и правильное использование кавычек. Ошибка, с которой мы сталкиваемся, указывает на проблемы с интерпретацией пути и переданным аргументом.
Вот подробное руководство по исправлению этой проблемы:
Исправление команды docker exec
-
Использование кавычек:
Для передачи аргументов в команду внутри контейнера необходимо использовать двойные кавычки для строки, передаваемой вdocker exec
, и одинарные кавычки для переменных внутри этой строки. Это позволяет правильно интерпретировать аргументы и избежать ошибок. -
Изменение
host_script.sh
:#!/bin/sh path="/some/other/path" results=$(docker exec mycontainer sh -c './scripts/container_script.sh '"$path") echo $results
В данном исправленном сценарии мы используем
sh -c
для выполнения команды в контейнере через двоичные кавычки (“). Таким образом, переменные оболочки правильно интерпретируются и передаются в сценарий внутри контейнера. -
Проверка доступа к файлам и путям:
Убедитесь, что сценарийcontainer_script.sh
находится в контейнере по заданному пути./scripts/
и имеет права на выполнение. Это можно сделать, при необходимости, с помощью команды:chmod +x ./scripts/container_script.sh
-
Обновление
container_script.sh
:#!/bin/sh echo "Hello World" echo $1
Сценарий в контейнере остается прежним, он принимает переданный аргумент как
$1
и выводит его.
Заключение
Эти изменения обеспечивают корректную передачу аргументов во время выполнения сценариев внутри Docker-контейнера. Придерживаясь данного подхода с использованием правильной обработки командных строк и переменных, можно эффективно управлять выполнением процессов внутри контейнеров Docker без ошибок, указанных в вашем вопросе.