Лучшая практика docker-entrypoint для выполнения скрипта
Я хочу запустить пару скриптов на моем docker-entrypoint.sh
;
Мой вопрос, имеет ли это какое-то значение, и если да, то каков рекомендуемый способ сделать это, относительно следующих вариантов:
А.
${HOMEDIR}/myscript --param1 --param2
Б.
bash -c "${HOMEDIR}/myscript --param1 --param2"
C.
source ${HOMEDIR}/myscript --param1 --param2
1 ответ
Это на самом деле зависит от того, что вы делаете и что вы пытаетесь сделать.
${HOMEDIR}/myscript --param1 --param2
Этот исполнит скрипт. Когда скрипт выполнен, любые изменения, которые он внес в среду, отбрасываются.
bash -c "${HOMEDIR}/myscript --param1 --param2"
Бег bash -c "my command here"
против просто бег my command here
в первую очередь отличается тем, что первый запускает подоболочку, а второй выполняет команды в текущей оболочке.
Однако существует ряд различий в эффектах:
Изменения среды, сделанные в подоболочке, не могут повлиять на родительскую оболочку (текущий каталог, значения переменных среды, определения функций и т. Д.)
Переменные, установленные в родительской оболочке, которые не были экспортированы, будут недоступны в подоболочке.
Вот моя ссылка, так как я не знал много о bash -c
source ${HOMEDIR}/myscript --param1 --param2
Когда вы вызываете источник (или его псевдоним), вы вставляете скрипт в текущий процесс bash. Таким образом, вы можете прочитать переменные, установленные сценарием.
Когда вы вызываете sh, вы запускаете форк (подпроцесс), который запускает новый сеанс / bin / sh, который обычно является символической ссылкой на bash. В этом случае переменные среды, установленные подпрограммой, будут отброшены после ее завершения.
Также здесь моя ссылка.
TL; DR: если вы не хотите, чтобы bash сохранял изменения, которые вы хотите внести в сценарии, на которых вы будете работать, я рекомендую вам использовать (A). Если вы хотите, чтобы bash сохранял переменные и изменения, используйте (C). Если вы хотите сохранить изменения и заставить bash запустить скрипт на другом bash, используйте (B), поскольку я перечислил различия между ними.