Как использовать docker exec для выполнения shell-скрипта с аргументом в контейнере?

Вопрос или проблема

У меня есть оболочечный скрипт на хосте, который вызывает другой скрипт для выполнения внутри контейнера. Вот простой пример, который работает нормально:

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

  1. Использование кавычек:
    Для передачи аргументов в команду внутри контейнера необходимо использовать двойные кавычки для строки, передаваемой в docker exec, и одинарные кавычки для переменных внутри этой строки. Это позволяет правильно интерпретировать аргументы и избежать ошибок.

  2. Изменение host_script.sh:

    #!/bin/sh
    
    path="/some/other/path"
    results=$(docker exec mycontainer sh -c './scripts/container_script.sh '"$path")
    echo $results

    В данном исправленном сценарии мы используем sh -c для выполнения команды в контейнере через двоичные кавычки (“). Таким образом, переменные оболочки правильно интерпретируются и передаются в сценарий внутри контейнера.

  3. Проверка доступа к файлам и путям:
    Убедитесь, что сценарий container_script.sh находится в контейнере по заданному пути ./scripts/ и имеет права на выполнение. Это можно сделать, при необходимости, с помощью команды:

    chmod +x ./scripts/container_script.sh
  4. Обновление container_script.sh:

    #!/bin/sh
    
    echo "Hello World"
    echo $1

    Сценарий в контейнере остается прежним, он принимает переданный аргумент как $1 и выводит его.

Заключение

Эти изменения обеспечивают корректную передачу аргументов во время выполнения сценариев внутри Docker-контейнера. Придерживаясь данного подхода с использованием правильной обработки командных строк и переменных, можно эффективно управлять выполнением процессов внутри контейнеров Docker без ошибок, указанных в вашем вопросе.

Оцените материал
Добавить комментарий

Капча загружается...